c++ - 模板参数绑定
问题描述
我想要的是 std::bind 之类的功能,但用于模板。假设我有一个模板,它需要一个带有一组已定义参数的模板模板。现在我有另一个可以工作但有更多参数的模板,所以我需要将这个复杂的模板转换为一个带有绑定参数的更简单的模板。
为此,我创建了一个定义别名模板的模板。
如果我将此绑定模板与具体类型一起使用,则效果很好。但是如果我用另一个模板参数实例化绑定模板,gcc 和 clang 会假定别名不是模板模板。我知道它变成了一个从属名称,但没有什么比typename
模板消歧器更好的了。
使用 icc 和 msvc 可以正常工作。
template<
template<typename> typename Template
>
class ATypeWhichNeedsATemplateTemplate
{
};
template<typename A, typename B>
class AComplexTemplate
{
};
template<
template<typename...> typename ATemplate
,typename... Args
>
class Binder {
public:
template<typename T>
using type = ATemplate<T, Args...>;
};
template<typename T>
class AClassWithBoundTemplate : public ATypeWhichNeedsATemplateTemplate<
Binder<AComplexTemplate, T>::type
>
{
};
铿锵声抱怨:
<source>:30:5: error: template argument for template template parameter must be a class template or type alias template
Binder<AComplexTemplate, T>::type
^
gcc 说了类似的话:
<source>:31:1: error: type/value mismatch at argument 1 in template parameter list for 'template<template<class> class Template> class ATypeWhichNeedsATemplateTemplate'
>
^
<source>:31:1: note: expected a class template, got 'Binder<AComplexTemplate, T>::type'
解决方案
type
是一个依赖模板名称。您需要将其拼写为Binder<AComplexTemplate, T>::template type
,即:
template<typename T>
class AClassWithBoundTemplate : public ATypeWhichNeedsATemplateTemplate<
Binder<AComplexTemplate, T>::template type
>
{
};
固定 godbolt 示例:https ://godbolt.org/z/7nJtAU
推荐阅读
- laravel - 想要使用 laravel 通过贷款表中的下拉按钮分配员工。它显示列表但未选择员工。并分配它
- google-chrome - 如何在 Google Chrome 扩展程序中为 webRequest 事件 onBeforeRequest 执行脚本
- php - 如果未达到特定类别的最低数量,则阻止 WooCommerce 结帐
- ubuntu - 如何从 Debian 11 中的 .pkg.tar.zst 在终端中解压缩一个文件 libffmpeg.so 而没有文件夹和子文件夹?
- angular - 无法从 C:/Users/lib/users.module.ts 在 C:/Users/lib/pages/login/login.component.ts 中写入对 LoginComponent 的引用
- python - Z3 Python 检查对是否不同
- javascript - Nextjs图像组件在地图上加载缓慢
- python - 无法在 Ubuntu 20 上安装 Yugabytedb
- c++ - 从轮廓和蒙版获取图像
- html - CSS 存在于本地环境中,但不存在于服务器环境中