[英]Variadic template templates and perfect forwarding
本質上,我想自動創建std::make_pair
, std::bind1st
和std::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.