在可变参数模板模板中的变异模板演绎

时间:2013-09-10 16:50:43

标签: c++ templates c++11 variadic-templates

我不确定标题是否有意义,但这个例子实际上非常明确:

// A converter struct with a generic constructor.
template <template <typename ...> class TT>
struct converter
{
        template <typename ... Args>    
        converter(const TT<Args ...> &);
};

// A few class templates.
template <typename T>
struct foo {};

template <typename T, typename U>
struct foo2 {};

template <typename ... Args>
struct foo_variadic {};

template <typename Arg0, typename ... Args>
struct foo_variadic2 {};

int main()
{
        // All these compile.
        converter<foo>(foo<int>{});
        converter<foo2>(foo2<int,double>{});
        converter<foo_variadic>(foo_variadic<>{});   
        converter<foo_variadic>(foo_variadic<int>{});
        converter<foo_variadic>(foo_variadic<int,double>{});
        // This will not compile.
        // converter<foo_variadic2>(foo_variadic2<int>{});                     
}

我已尝试使用GCC 4.8.1和clang 3.3,错误消息有所不同,但它们都指向在第5行周围推断Args的一些问题(以及随后排除converter构造函数候选人名单)。

foo_variadic2如何与其他foo相比有什么特别或不同?

(对于记录,我正在尝试实现is_instance_of类型特征来检测模板类的实例)

更新

现在我的设置中的GCC 4.8.3和4.9.1都接受了这一点。 clang 3.4.2仍在吠叫。

1 个答案:

答案 0 :(得分:1)

这不是解决方案,但可以帮助您或其他人找出问题所在。以下编译:

template <template <typename ...> class TT>
struct converter2
{
    template <typename Arg0, typename ... Args>    
    converter2(const TT<Arg0, Args ...> &);
};

// ...

converter2<foo_variadic2>(foo_variadic2<int>{});

我必须承认我不明白为什么这是必要的以及为什么你的代码不起作用。