簡體   English   中英

C ++模板函數有沒有辦法正好采用N個參數?

[英]Is there any way for a C++ template function to take exactly N arguments?

我的意思是,例如,類的構造函數如下所示:

class vector<size_t N, typename FLOAT=double> {
    vector(FLOAT ...x) {} // I want exactly N arguments here
};

我希望這是明確的,我希望有一個可變參數函數,但這恰恰 N個參數,當N在編譯時已知的功能。 因此,使用上面的示例, vector<3>(1.5, 2.5)應該產生編譯時錯誤,而vector<2>(1.5, 2.5)應該編譯並運行。

這可能嗎?

我想也許這可以通過參數包完成,但我不太確定如何。

通過一些間接,您可以執行以下操作:

template <std::size_t, typename T> using alwaysT = T;

template <typename FLOAT, typename Seq> struct vector_impl;

template <typename FLOAT, std::size_t... Is>
struct vector_impl<FLOAT, std::index_sequence<Is...>> {
     vector_impl(alwaysT<Is, FLOAT>... floats) { /*...*/}
};

template <std::size_t N, typename FLOAT>
using vector = vector_impl<FLOAT, std::make_index_sequence<N>>;

可能最簡單的方法就是使用static_assert 根據需要添加模式匹配:

template<int N, typename... Args>
void foo(Args... args) {
    static_assert(sizeof...(args) == N, "Incorrect number of arguments");
    // stuff
}

這將在大多數情況下完成,甚至允許您有一個友好的友好自定義錯誤。

暫無
暫無

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

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