如何编写可以专门用于对象或int N的模板

时间:2016-06-17 11:55:56

标签: c++ templates c++11 c++14

我想要实现的是一个带有“灵活”第一个参数的模板(很可能类似于数组元素,与std::vector的第一个参数不同)和第二个参数。对于第二个参数,我想要对其数字(如std::array中的size参数)或一般类的情况进行特化。

对于课程Foo,我目前有

template <typename T, template <typename> typename Y > class Foo{};

原因就在于我认为我可以写专业化:

template<typename T> class Foo<T, int N>{};

并且,给定struct Bar{}

template<typename T> class Foo<T, Bar>{};

但编译器(C ++ 11,ideone.com)在带有规范的行上输出错误“error: template argument 2 is invalid”。

据推测,我已经错误地形成了非专业化声明。或者这甚至可能吗?

1 个答案:

答案 0 :(得分:4)

您可以使用帮助器模板来包装整数并将其转换为类型。这是Boost.MPL使用的方法。

#include <iostream>

template <int N>
struct int_ { }; // Wrapper

template <class> // General template for types
struct Foo { static constexpr char const *str = "Foo<T>"; };

template <int N> // Specialization for wrapped ints
struct Foo<int_<N>> { static constexpr char const *str = "Foo<N>"; };

template <int N> // Type alias to make the int version easier to use
using FooI = Foo<int_<N>>;

struct Bar { };

int main() {
    std::cout << Foo<Bar>::str << '\n' << FooI<42>::str << '\n';
}

输出:

Foo<T>
Foo<N>

Live on Coliru