首页 > 解决方案 > 模板参数绑定

问题描述

我想要的是 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'

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

解决方案


type是一个依赖模板名称。您需要将其拼写为Binder<AComplexTemplate, T>::template type,即:

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

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


推荐阅读