也许我累了,但我被这个简单的部分专业化困住了,这是因为non-type template argument specializes a template parameter with dependent type 'T'不起作用
template <typename T, T N> struct X;
template <typename T> struct X <T, 0>;将0替换为T(0)、T{0}或(T)0无助于此。那么,这种专业化有可能吗?
发布于 2014-03-18 17:24:21
见标准的temp.class.spec 14.5.5/8段:
与专用的非类型参数相对应的模板参数的类型不应依赖于专门化的参数。[例子: 模板<类T,T t>结构C {};模板结构C;// template< int X,int (*array_ptr)X >类A {};int array5;template< int X>类A { };//错误 -end示例]
编辑的答案:最简单的解决方法是用一个类型的模板参数替换一个非类型的模板参数:
#include <type_traits>
template <typename T, typename U>
struct X_;
template <typename T, T N>
struct X_<T, std::integral_constant<T, N>> {};
template <typename T>
struct X_<T, std::integral_constant<T, 0>> {};
template <typename T, T N>
struct X : X_<T, std::integral_constant<T, N>> {};发布于 2014-03-18 17:47:26
使用Yakk的解决方案:
#include <iostream>
#include <type_traits>
template <typename T, T N, typename = void >
struct X {
static const bool isZero = false;
};
template <typename T, T N>
struct X < T, N, typename std::enable_if<N == 0>::type > {
static const bool isZero = true;
};
int main(int argc, char* argv[]) {
std::cout << X <int, 0>::isZero << std::endl;
std::cout << X <int, 1>::isZero << std::endl;
return 0;
}Live Demo
发布于 2014-03-18 17:32:10
您可以将一个typename=void参数添加到template参数列表的末尾,然后在专门化中使用std::enable_if_t< Content>。
https://stackoverflow.com/questions/22486386
复制相似问题