我有以下代码:
#include <tuple>
#include <utility>
#include <iostream>
template<class T>
struct e {
};
template <>
struct e<int N> {
static const int value = N;
};
int main() {
std::cout << e<5>::value << std::endl;
}
哪个给我一个类型不匹配的信息。我意识到5是r值,所以我猜我的解决方案可能看起来像
e<int &&N>
但这也不起作用。我该怎么做才能实现呢?我是否还在使用术语正确的callint <int N>
作为类型化模板参数,其中<typename/class T>
是非类型化模板参数?
答案 0 :(得分:4)
您已经为主模板指定了类型名,然后便无法专注于int的值。您的主要模板必须是
template <int N>
struct e
{ static const int value = N; };
然后您将专注于特定值。当然,以您的示例为例,假设您仅具有int
值,那么上面的模板就足够了,根本不需要专门化。
但是,假设可以使用其他类型,则可以部分地专注于std::integral_constant
或类似的对象,这可以让您专注于类型(包装int值)。
类似
#include <iostream>
#include <type_traits>
template<class T>
struct e {
};
template <int N>
struct e<std::integral_constant<int,N> > {
static const int value = N;
};
int main() {
std::cout << e<std::integral_constant<int,5>>::value << std::endl;
}