簡體   English   中英

Variadic模板模板和完美的轉發

[英]Variadic template templates and perfect forwarding

關於對象生成器模式的 這個問題讓我想到了自動化它的方法。

本質上,我想自動創建std::make_pairstd::bind1ststd::mem_fun函數,這樣就不必為每個模板類類型編寫不同的函數,而是可以編寫單個可變參數模板模板函數一次處理所有案件。 這個函數的用法如下:

make<std::pair>(1, 2);         // equivalent to std::make_pair(1, 2)
make<std::binder2nd>(&foo, 3); // equivalent to std::bind2nd(&foo, 3);

有可能寫這個函數make嗎? 我試過這個,但它在GCC 4.5或4.6中不起作用:

template <template <typename...> class TemplateClass, typename... Args>
TemplateClass<Args...> make(Args&&... args)
{
    return TemplateClass<Args...>(std::forward<Args>(args)...);
}

如果我試着調用(例如) make<std::pair>(1, 2)我就得到

error: no matching function for call to 'make(int, int)'

我在這里的語法錯了嗎?
或者這是對的,海灣合作委員會是錯的嗎?
或者這在C ++ 0x中根本不可能?

[編輯]

建議N2555似乎表明這是允許的, 海灣合作委員會聲稱已在GCC4.4中實施

這是完全正確的。 我希望它能起作用。 所以我認為GCC拒絕這一點是錯誤的。 FWIW:

#include <utility>

template <template <typename...> class TemplateClass, typename... Args>
TemplateClass<Args...> make(Args&&... args)
{
    return TemplateClass<Args...>(std::forward<Args>(args)...);
}

int main() {
  make<std::pair>(1, 2);
}


// [js@HOST2 cpp]$ clang++ -std=c++0x main1.cpp
// [js@HOST2 cpp]$

這可能是GCC的怪癖。 我可以使用dev快照獲取以下內容(我現在沒有4.6的副本):

template<
    template<typename...> class TemplateClass
    , typename... Args

    , typename Result = TemplateClass<Args...>
    // Also works with the arguably more correct
    // , typename Result = TemplateClass<
    //     typename std::decay<Args>::type...
    // >
>
Result
make(Args&&... args)
{ /* as before */ }

這是非常錯誤的 - 例如,使用make_shared make_shared的要點是使用它可以節省運行時效率。 但是如果我嘗試使用make<std::shared_ptr>會發生什么? 不要以為那會很有效。 或者類型如何只有一些構造函數參數是模板參數,其余的不是? 例如, make<std::vector, int>(other_vector.begin(), other_vector.end()); - 迭代器的類型不參與,但無論如何都要傳遞它們。

編寫泛型make函數是不可能的。

至於標准,從那以后它很容易被刪除。 你必須檢查FDIS。

暫無
暫無

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

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