模板参数绑定
Template Argument Binding
我想要的是类似于 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
>
{
};
修复了神螺栓示例:https://godbolt.org/z/7nJtAU
相关文章:
- 为什么 std::绑定错误参数可以成功?
- C++初始化 std::function 时如何将占位符绑定到引用/引用参数?
- 绑定到可变参数成员函数
- 如何在 C# 中将带有参数的函数绑定到包中
- 如何在宏中正确转发结构化绑定参数
- std::绑定可变参数模板、绑定参数和占位符
- libpqxx:如何绑定参数数组
- 传递 boost::绑定参数作为参数
- std::绑定参数复制行为
- 绑定参数多于所需的函数,并向其传递明确的参数
- 信号和绑定参数
- 使用尽可能少的代码将非静态方法包装到 std::函数中"this"并绑定参数
- C++sqlite3绑定参数
- c++使用ODBC绑定参数预先确定VARCHAR的长度
- 在SQLite3中绑定参数是如何工作的(最小示例)
- 如何在Postgresql中准备语句和绑定参数
- 如何调试SQLite3中的绑定参数
- 在设置函数指针之前绑定参数
- 使用boost::fusion::for_each时传递/绑定参数
- 使用std::bind分别绑定参数和对象实例