模板参数绑定

Template Argument Binding

本文关键字:绑定 参数      更新时间:2023-10-16

我想要的是类似于 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