C++ 模板作为模板的参数
C++ Templates as arguments for templates
我运行遇到下面的问题。我有以下模板 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的正确方法是什么?我认为这里可能需要模板模板参数,但我也无法让它工作。将不胜感激。
Number<int>
不能用作 non-type template parameter because User defined classes aren't one of the allowed types. The allowed types are (reproduced from cppreference.com):
- std::nullptr_t (since C++11);
- integral type;
- lvalue reference type (to object or to function);
- pointer type (to object or to function);
- pointer to member type (to member object or to member function);
- enumeration type.
您可以简单地按照评论n.m
中的建议进行操作
template<typename n1, typename n2>
struct Number_add
{
static const int value = n1::value + n2::value;
}
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.
我运行遇到下面的问题。我有以下模板 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的正确方法是什么?我认为这里可能需要模板模板参数,但我也无法让它工作。将不胜感激。
Number<int>
不能用作 non-type template parameter because User defined classes aren't one of the allowed types. The allowed types are (reproduced from cppreference.com):
- std::nullptr_t (since C++11);
- integral type;
- lvalue reference type (to object or to function);
- pointer type (to object or to function);
- pointer to member type (to member object or to member function);
- enumeration type.
您可以简单地按照评论n.m
中的建议进行操作
template<typename n1, typename n2>
struct Number_add
{
static const int value = n1::value + n2::value;
}
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.