簡體   English   中英

C ++ 11中的固定長度可變參數包

[英]Fixed Length Variadic Parameter Packs in C++11

我正在嘗試使用C ++ 11實現一個通用的n維向量類。 理想情況下,我想提供類型“T”和向量的維數“n”,並讓構造函數接受適當數量的參數。

不幸的是,我一直無法找到一種方法來允許模板指定的參數包的固定長度。

我正在尋找的是類似的東西

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

    ...
};

是否有可能做到這一點?

好吧,你可以使用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大小的構造函數。

你也可以使用這個技巧:

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采用類型為T n參數,不需要額外的模板。 您還可以在命名空間中隱藏Ignore... ugliness:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM