我想要实现的是一个带有“灵活”第一个参数的模板(很可能类似于数组元素,与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
”。
据推测,我已经错误地形成了非专业化声明。或者这甚至可能吗?
答案 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>