C ++ 11中的固定长度可变参数包

时间:2014-07-09 19:09:02

标签: c++ templates gcc c++11 variadic-templates

我正在尝试使用C ++ 11实现一个通用的n维向量类。理想情况下,我想提供类型“T”和向量的维数“n”,并让构造函数接受适当数量的参数。

不幸的是,我一直无法找到允许模板指定固定长度的参数包的方法。

我正在寻找的是像

template<typename T, size_t n>
class Vector {
public:
    Vector(T... values /* values is exactly n parameters long */);

    ...
};

是否可以这样做?

2 个答案:

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