C++模板作为模板参数

3
我遇到了以下问题。我有以下模板Number:
template<int n>
struct Number
{
    static const int value = n;
};

现在假设我想在编译时添加两个这样的数字。具体地说,我希望使以下代码段正常工作:

//The following code should display 7:
std::cout << Number_add< Number<3>, Number<4> >::value << std::endl;

我尝试过类似这样的东西,但我的编译器不喜欢它。
template<Number<int> n1, Number<int> n2>
struct Number_add
{
    static const int value = n1::value + n2::value;
}

什么是实现Number_add的正确方法?我认为这里可能需要模板模板参数,但我也无法使其有效。如果能提供帮助,将不胜感激。

3
template<class n1, class n2> struct Number_add - n. m.
啊,它可以工作了,非常感谢! - arriopolis
2个回答

4
Number<int>无法用作非类型模板参数,因为用户定义的类不是允许的类型之一。允许的类型包括(从cppreference.com复制):
  • std::nullptr_t(自C++11起);
  • 整数类型;
  • 左值引用类型(对对象或函数);
  • 指针类型(对对象或函数);
  • 成员指针类型(对成员对象或成员函数);
  • 枚举类型。

你可以像评论中 n.m 建议的那样简单地操作。

template<typename n1, typename n2>
struct Number_add
{
    static const int value = n1::value + n2::value;
}

1
template<int A, int B>
constexpr Number<A+B>
operator+(Number<A>, Number<B> ){ return {}; }

template<class Lhs, class Rhs>
using Number_add=decltype(Lhs{}+Rhs{});

std::cout << Number_add< Number<3>, Number<4> >::value << std::end;

打印7。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接