模板参数绑定

时间:2019-05-31 10:02:24

标签: c++ c++11 templates c++17 template-meta-programming

我想要的是类似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
>
{    
};

see on godbolt

c声抱怨:

<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'

1 个答案:

答案 0 :(得分:3)

type是从属模板名称。您需要像Binder<AComplexTemplate, T>::template type这样拼写,​​即e。:

template<typename T>
class AClassWithBoundTemplate : public ATypeWhichNeedsATemplateTemplate<
    Binder<AComplexTemplate, T>::template type
>
{    
};

固定的锚栓示例:https://godbolt.org/z/7nJtAU