为什么这种结构不起作用?
Visual Studio显示错误C3201:类模板的模板参数列表&#39; AA&#39;与模板参数&#39; C&#39;的模板参数列表不匹配。但在两种情况下似乎都是<int, char, bool>
。
template<int I, char C, bool B>
struct AA
{
static const int i = I;
static const char c = C;
static const bool b = B;
};
template<typename... T>
struct outer
{
template <template<T... > typename C>
struct inner
{
template<T... X>
using type = C<X...>;
};
};
static_assert(outer<int, char, bool>::inner<AA>::type<5, 'a', true>::i == 5, "???");
ADDED:此外,编译器无法推断专业化类型,例如
template<class T, template<T> class C, T X>
struct A<C<X>> { ... };
这些技巧是否被标准禁止或只是编译器限制?
答案 0 :(得分:0)
我怀疑这是允许的,这只是编译器搞砸了。当我尝试使用它来获得解决方法时,我遇到了很多内部编译器错误;这通常表明它不是故意拒绝的,而且错误消息毫无意义。
在 c++20 中,我可以生成此解决方法。
template<int I, char C, bool B>
struct AA
{
static const int i = I;
static const char c = C;
static const bool b = B;
};
template<template<auto... > typename C, typename... Ts>
struct outer_base
{
struct inner
{
template<Ts... X>
using type = C<X...>;
};
};
template<typename... Ts>
struct outer
{
template <template<auto... > typename C>
using inner = typename outer_base<C, Ts...>::inner;
};
static_assert(outer<int, char, bool>::inner<AA>::type<5, 'a', true>::i == 5, "???");
这比您喜欢的要少一些,因为它不需要 C
来精确匹配类型 Ts...
,只需与它们兼容即可。