簡體   English   中英

C ++可變參數模板 - 限制args數

[英]C++ variadic template - limit number of args

我有一個帶有set函數的可變參數模板類,它填充了interal數組:

template <size_t Dim>
class Vector
{
public:

    void SetValueTemplate(size_t index)
    {
        return;
    }

    template <typename X0, typename ...Xn>
    void SetValueTemplate(size_t index, X0 x0, Xn... xn)
    {
        val[index] = x0;
        SetCenterValueTemplate(index + 1, xn...);
    }

    template <typename ...X0>
    void SetValue(X0... t0)
    {
        SetValueTemplate(0, t0...);
    }

private:
    double val[Dim];
};

問題是,我可以稱之為

Vector<3> v;
v.SetValue(0, 1, 2, 4, 5);

它正確編譯。 我可以將此限制為不編譯嗎? 我可以使用static_assert ,但沒有它可能嗎?

是的,這是可能的,沒有static_assert 例如,假設我們希望我們的vector類只能使用參數的名稱編號作為向量的維度進行賦值,您可以使用:

template<std::size_t Dim>
struct vector {
    template <typename X0, typename ...Xn>
    typename std::enable_if<sizeof...(Xn) + 1 == Dim, void>::type
    assign(X0 x0, Xn... xn) {}
};

這只是將std::enable_ifsizeof...結合使用來啟用或禁用特定的assign函數。

所以以下將編譯:

vector<3> x;
x.assign(1, 2, 3);

現場演示

但這不會:

vector<3> x;
x.assign(1, 2, 3, 4);

現場演示

與(對於Clang):

main.cpp:14:7: error: no matching member function for call to 'assign'
    x.assign(1, 2, 3, 4);
    ~~^~~~~~

這也不會:

vector<3> x;
x.assign(1, 2);

現場演示

有類似的錯誤消息。

暫無
暫無

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

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