具有任何非类型参数的C ++模板专业化

时间:2019-05-17 04:40:24

标签: c++ templates specialization

我想专门研究模板。该专业化将具有非类型模板参数的另一种模板作为一种类型。我希望专业化适用于非类型参数的任何值。我可以专门处理特定的非类型值,但是我一般不知道该怎么做。

例如:

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的专业化?

3 个答案:

答案 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;

尽管在某些实现中这可能无关紧要,并且前面提到的用法仍然可以使用。

祝你好运!