C++任何非类型参数的模板专用化
C++ template specialization with any non-type parameter
我想专门化一个模板。专用化将具有非类型模板参数的另一个模板作为一种类型。我希望专用化适用于非类型参数的任何值。我可以专门针对特定的非类型值,但通常我不知道该怎么做。
例如:
template<typename T, int N> // first definition
struct A;
template<typename T> // second definition
struct B;
template<> // this compiles, N is fixed
struct B<A<float,1>>;
template<> // For general N this doesn't compile, says
struct B<A<float,int>>; // "expected a constant of type ‘int’, got ‘int’"
有没有办法完成它,这样如果参数为 A,我就有 B 的特化,无论 A 的 int N 值是多少?
这不起作用的原因是您将 int 类型作为模板参数传递,您需要一个整数值。要允许任何整数值作为参数,您应该编写类似
template<int P> // For any int value P
struct B<A<float,P>>;
而不是
template<>
struct B<A<float,int>>;
用
template<int N>
struct B<A<float, N>>;
第一个不起作用,因为A
需要一个类型和一个int
,而不是两个类型。
我希望专用化适用于非类型参数的任何值。
我的建议确实会这样做。
B<A<float, 1>> b1; // Uses the specialization
B<A<float, 200>> b2; // Also uses the specialization
专业如:
template<>
struct B<A<float,int>>{...};
不正确,因为声明template<typename T, int N> struct A;
声明 N 是类模板的类型为int
的模板非类型/非模板参数。并且它不能用类型代替(在这种情况下int
)。
在这种情况下,应该只提供一个值参数,并且由于希望对任何值进行专用化,但只能使用一种类型(在以下示例中float
),首先,值作为通用情况的表示形式应出现在template< ___ >
中,以便使用它来定义术语B< _____ >
。
在这种情况下有 2 个选项,例如:
template<int N>
struct B<A<float,N>>{...};
或者像:
template<auto N>
struct B<A<float,N>>{...};
在这两种情况下,编译器都准备查找一个值来替换N
作为模板非类型/非模板参数。
最后,类模板B
可以像这样使用:
B<A<float, 666> > possessed_object;
另请注意,如果N
的类型与int
不同,例如,如果它是size_t
的,当使用第二个选项(带auto
的选项)时,例如:
template<typename T, size_t N>
struct A{...};
template<auto N>
struct B<A<float,N>>{...};
然后(有保证的)用法变成:
B<A<float, size_t(666)> > possessed_object;
尽管在某些实现中这可能无关紧要,并且第一个提到的用法可能仍然可以使用。
祝你好运!
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 通过依赖类型使用非类型模板参数的单类型模板参数类模板的部分专用化
- std::stoi 的版本拒绝任何非数字
- 具有可变参数非类型参数的模板专用化
- 您能否实例化模板的非专用版本并在专用化中继承它?
- GCC 和非命名空间范围内的显式专用化
- 如何将任何化合物还原为非化合物类型
- 从非模板类调用专用模板方法
- flat_hash_map.h:错误 C3203:"templated_iterator":非专用类模板
- C++任何非类型参数的模板专用化
- 如何确定具有文件路径的字符串中是否有任何非 ASCII 字符
- 如何设计可序列化类以使任何非序列化属性都会导致编译时错误
- 成员子对象继承存储持续时间是否有任何非直观的副作用
- 专用于非模板类的模板化构造函数
- 部分专用化非类型参数
- 专用于非模板类的可变参数模板成员函数
- MFC 反编译为任何非汇编代码
- 具有专用和非专用类型的模板重载
- C++ 模板专用化 - 非类型模板参数 '__formal 的非法类型
- 视觉 任何非(字符*)正确的方法,用于从 C++ 中的常量字符串初始化 void*