如何为一种类型专门化可变参数模板 class?
How to specialize variadic template class for one type?
我正在尝试针对特定类型专门化可变参数模板 class。
我正在努力实现这个目标:
template<typename... Ts>
class myclass
{
///...
};
template<>
class myclass<int... N>
{
///...
};
我得到这个错误:
error C2760: syntax error: unexpected token 'int', expected 'expression'
error C2187: syntax error: '...' was unexpected here
error C2065: 'N': undeclared identifier
error C2913: explicit specialization; 'ex::vec' is not a specialization of a class templa
任何人都可以提示我做错了什么吗?
您的 myclass
声明为模板参数的可变列表
template<typename... Ts>
class myclass
您可以针对特定类型而不是特定值进行专门化,如您的问题(针对语法进行了更正,但对于 types/values 问题仍然是错误的)
template <int N>
class myclass<N...>
如果您将值作为 class 的模板参数,则不同,例如
template <typename ... Ts>
class myclass
{ };
template <template <int...> class C, int ... Is>
class myclass<C<Is...>>
{ };
// ...
template <int ...>
class foo
{ };
// ...
myclass<foo<0, 1, 2>> m0; // uses specialization
以下代码是解决您的问题的方法,而不是直接的解决方案。
直接处理参数包可能非常棘手,所以让我们添加一个间接级别。您可以 "wrap" the parameter pack 使用另一个模板,而不是尝试专门化您的可变参数模板:
#include <type_traits>
template <class... T>
struct wrapper;
// Uses C++17 metafunction for brevity
template <class T, class... Ts>
struct all_same : std::conjunction<std::is_same<T, Ts>...>
{};
template <class T, class Enable = void>
struct test;
template <template <class...> class Wrapper, class... Ts>
struct test<Wrapper<Ts...>, std::enable_if_t<all_same<Ts...>::value>>
{};
int main()
{
test<wrapper<int, int>> t;
//test<wrapper<int, double>> t1; // won't compile, as we haven't defined the primary template
}
我正在尝试针对特定类型专门化可变参数模板 class。
我正在努力实现这个目标:
template<typename... Ts>
class myclass
{
///...
};
template<>
class myclass<int... N>
{
///...
};
我得到这个错误:
error C2760: syntax error: unexpected token 'int', expected 'expression'
error C2187: syntax error: '...' was unexpected here
error C2065: 'N': undeclared identifier
error C2913: explicit specialization; 'ex::vec' is not a specialization of a class templa
任何人都可以提示我做错了什么吗?
您的 myclass
声明为模板参数的可变列表
template<typename... Ts>
class myclass
您可以针对特定类型而不是特定值进行专门化,如您的问题(针对语法进行了更正,但对于 types/values 问题仍然是错误的)
template <int N>
class myclass<N...>
如果您将值作为 class 的模板参数,则不同,例如
template <typename ... Ts>
class myclass
{ };
template <template <int...> class C, int ... Is>
class myclass<C<Is...>>
{ };
// ...
template <int ...>
class foo
{ };
// ...
myclass<foo<0, 1, 2>> m0; // uses specialization
以下代码是解决您的问题的方法,而不是直接的解决方案。
直接处理参数包可能非常棘手,所以让我们添加一个间接级别。您可以 "wrap" the parameter pack 使用另一个模板,而不是尝试专门化您的可变参数模板:
#include <type_traits>
template <class... T>
struct wrapper;
// Uses C++17 metafunction for brevity
template <class T, class... Ts>
struct all_same : std::conjunction<std::is_same<T, Ts>...>
{};
template <class T, class Enable = void>
struct test;
template <template <class...> class Wrapper, class... Ts>
struct test<Wrapper<Ts...>, std::enable_if_t<all_same<Ts...>::value>>
{};
int main()
{
test<wrapper<int, int>> t;
//test<wrapper<int, double>> t1; // won't compile, as we haven't defined the primary template
}