簡體   English   中英

如何將可變參數函數模板中的每個參數轉換為另一種類型並獲取其地址?

[英]How can I convert each parameter in a variadic function template to another type and obtain its address?

這個問題與在這里提出的其他問題類似,但有一個小轉折。 我有一個像這樣的常規功能:

void Bar(std::initializer_list<Base*> objects);

現在,我想創建一個函數模板,將每個參數包裝在從Base派生的類型中,並將它們傳遞給上面的函數。 就像是:

template <class... Params> void Foo(Params... parameters)
{
    Bar({&Wrapper<Params>(parameters)...});
}

Wrapper類專門用於各種類型。)該代碼實際上是在MSVC中編譯的,但是編譯器會發出警告,因為我要使用rvalue的地址(標准不允許)。 是否有一種簡單,符合標准的方法來實現同一目標? (我認為我可以使用元組,integer_sequences和輔助函數來做到這一點,但我想盡可能避免這種情況。)

問題是Wrapper<T>實例必須存在於某個地址。 執行此操作的簡單方法是構造一個std::tuple<Wrapper<Params>...>實例。 令人討厭的部分是您必須使用std::get<N>提取出內容。 在C ++ 14中,存在std::index_sequence可以幫助您解決此問題。

template <class... Params, std::size_t... Idx>
void FooImpl(std::tuple<Wrapper<Params>...>& tup, std::index_sequence<Idx...>)
{
    Bar({ (&std::get<Idx>(tup))... });
}

template <class... Params>
void Foo(Params... parameters)
{
    std::tuple<Wrapper<Params>...> tup(Wrapper<Params>(parameters)...);
    FooImpl(tup, std::make_index_sequence<sizeof...(Params)>());
}

如果您的Bar const Wrapper<T>* s,則另一種選擇是使用C ++的常量引用規則來發揮自己的優勢。

template <class... Params>
void FooImpl(const Wrapper<Params>&... parameters)
{
    Bar({ (&parameters)... });
}

template <class... Params>
void Foo(Params... parameters)
{
    FooImpl(Wrapper<Params>(parameters)...);
}

暫無
暫無

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

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