如何对模板化的类型化参数进行专业化处理?

时间:2018-06-26 16:42:55

标签: c++ templates metaprogramming template-meta-programming

我有以下代码:

#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>是非类型化模板参数?

1 个答案:

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

Demo