当前位置: 首页 > 知识库问答 >
问题:

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

巫马瀚漠
2023-03-14

也许我累了,但是我被这个简单的局部特化卡住了,它不起作用,因为非类型模板参数用依赖类型'T'指定模板参数:

template <typename T, T N> struct X;
template <typename T>      struct X <T, 0>;

0替换为T(0)T{0}(T)0没有帮助。那么这种专门化是否可能呢?

共有3个答案

司英飙
2023-03-14

您可以将typename=void参数添加到template参数列表的末尾,然后使用std::enable\u if\t

韩宏朗
2023-03-14

使用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;
}

现场演示

张心水
2023-03-14

见本标准第14.5.5/8段【温度等级规范】:

与专门化的非类型参数相对应的模板参数的类型不应依赖于专门化的参数。[示例:

template <class T, T t> struct C {};
template <class T> struct C<T, 1>; // error

template< int X, int (*array_ptr)[X] > class A {};
int array[5];
template< int X > class A<X,&array> { }; // error

-[结束示例]

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

#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>> {};
 类似资料:
  • 我有一个通用算法,需要访问其模板类型的特征。有一个特征类可以专门用于提供这些特征。 在我的类中使用此算法时,我想将其与类中定义的私有类型一起使用。 然而,专门化只能发生在或全局范围内,而我的类是不可访问的。 是否有可能以某种方式专门化具有私有类型的模板,至少在可访问此类型的范围内? 也许可以将这个专门化声明为一个类?

  • 还尝试在专门化的中进行模板方法专门化: 这一次它编译,但调用原始方法,即 解决方案

  • 有人能告诉我为什么这行不通吗?以及如何让它发挥作用?

  • 我有几个模板参数的模板结构 此结构适用于所有模板,但结果无效的情况除外。我知道,不能实现为void类型,所以我当前的解决方案是使用如下的部分专门化: 这允许执行以下操作: 有没有一种方法可以使编译而不会在C 14标准中进行部分类特化?我可以使用和类型trait组合,但我想找到是否有一种方法: > 模板类方法的特殊化部分显式 模板类方法的实例化

  • 我有这样的代码: 这段代码的目的是:如果是或的子类,则将推导为,否则推导为

  • 我想编写一个函数模板,它返回各种类型的随机变量(bool、char、short、int、float、double,以及这些变量的无符号版本)。 我看不出如何使用最新的C 11标准库来实现这一点,因为我需要使用统一的int分布或统一的real分布。我想我可以专门化模板: 在Visual Studio 2012 Update 3下,这给出了: 错误C2668:“‘匿名命名空间’::randomPrim