我不确定这个标题是否有意义,但这个例子实际上很简单:
// 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,错误消息有所不同,但它们都指向Args
在第 5 行附近推断出的一些问题(以及随后converter
从候选列表中排除构造函数)。
相foo_variadic2
对于其他foo
s 有何特殊或不同?
(作为记录,我正在尝试实现一个is_instance_of
类型特征来检测模板类的实例)
更新
现在我的设置中的 GCC 4.8.3 和 4.9.1 都接受了这个。clang 3.4.2 还在吠叫。