我正在尝试使用C ++ 11实现一个通用的n维向量类。理想情况下,我想提供类型“T”和向量的维数“n”,并让构造函数接受适当数量的参数。
不幸的是,我一直无法找到允许模板指定固定长度的参数包的方法。
我正在寻找的是像
template<typename T, size_t n>
class Vector {
public:
Vector(T... values /* values is exactly n parameters long */);
...
};
是否可以这样做?
答案 0 :(得分:13)
好吧,你可以使用std :: enable_if:
template <typename... Args,
typename = typename std::enable_if<
sizeof...(Args) == n
>::type>
explicit Vector(Args&&... values) : _data{ std::forward<Args>(values)... } {}
它会影响可能接受除n之外的Args大小的构造函数。
答案 1 :(得分:3)
你也可以使用这个技巧:
template <typename T, std::size_t n, typename = std::make_index_sequence<n>>
class Vector;
template <typename T, std::size_t n, std::size_t... Ignore>
class Vector<T, n, std::index_sequence<Ignore...>>
{
template <size_t > using ith_T = T;
public:
Vector(ith_T<Ignore>... values)
{
}
};
这将确保Vector
获取n
类型的T
个参数,无需额外的模板。您还可以在命名空间中隐藏Ignore...
丑陋:
namespace details {
template <typename T, std::size_t n, typename = std::make_index_sequence<n>>
class Vector;
...
}
template <typename T, std::size_t n>
using Vector = details::Vector<T, n>;