我想专门研究模板。该专业化将具有非类型模板参数的另一种模板作为一种类型。我希望专业化适用于非类型参数的任何值。我可以专门处理特定的非类型值,但是我一般不知道该怎么做。
例如:
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的int N的值是多少,如果参数为A,我都有B的专业化?
答案 0 :(得分:3)
之所以不起作用,是因为您将int类型作为模板参数进行传递,而您需要一个整数值。要允许任何整数值作为参数,您应该编写类似
template<int P> // For any int value P
struct B<A<float,P>>;
答案 1 :(得分:2)
代替
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
答案 2 :(得分:0)
像这样的专业化
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;
尽管在某些实现中这可能无关紧要,并且前面提到的用法仍然可以使用。
祝你好运!