首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(部分)专门化依赖类型的非类型模板参数。

(部分)专门化依赖类型的非类型模板参数。
EN

Stack Overflow用户
提问于 2014-03-18 17:13:48
回答 4查看 12K关注 0票数 31

也许我累了,但我被这个简单的部分专业化困住了,这是因为non-type template argument specializes a template parameter with dependent type 'T'不起作用

代码语言:javascript
复制
template <typename T, T N> struct X;
template <typename T>      struct X <T, 0>;

0替换为T(0)T{0}(T)0无助于此。那么,这种专业化有可能吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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示例]

编辑的答案:最简单的解决方法是用一个类型的模板参数替换一个非类型的模板参数:

代码语言:javascript
复制
#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>> {};
票数 30
EN

Stack Overflow用户

发布于 2014-03-18 17:47:26

使用Yakk的解决方案:

代码语言:javascript
复制
#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

票数 11
EN

Stack Overflow用户

发布于 2014-03-18 17:32:10

您可以将一个typename=void参数添加到template参数列表的末尾,然后在专门化中使用std::enable_if_t< Content>

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22486386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档