我有一个可变参数模板(为了测试目的,禁用非专用版本):
template <typename...>
std::enable_if_t<false> S;
我想部分专门化它,但由于某种原因它不起作用(Visual Studio 2017 RC:error C2275: 'x': illegal use of this type as an expression
,error C3544: '<unnamed-symbol>': parameter pack expects a type template argument
):
template<typename... x>
int S<int(x)...> = sizeof...(x);
我想要达到的目标可以用这样的东西近似:
template<typename x1>
int S<int(x1)> = 1;
template<typename x1, typename x2>
int S<int(x1), int(x2)> = 2;
template<typename x1, typename x2, typename x3>
int S<int(x1), int(x2), int(x3)> = 3;
//etc
有没有办法让它发挥作用?
答案 0 :(得分:3)
此版本适用于http://webcompiler.cloudapp.net/
诀窍是将int(T)
隐藏在自己的自定义类型中:
template <typename T>
using FInt = int(T);
template <typename ... Ts>
int S = std::enable_if_t<(sizeof...(Ts) >= 0)>{};
template<typename ... Ts>
int S<FInt<Ts> ...> = sizeof...(Ts);