Variadic模板模板和完美的转发

Pet*_*der 46 c++ template-templates variadic-templates c++11

关于对象生成器模式的这个问题让我想到了自动化它的方法.

从本质上讲,我希望自动像功能的建立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);
Run Code Online (Sandbox Code Playgroud)

有可能写这个功能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)...);
}
Run Code Online (Sandbox Code Playgroud)

如果我试着打电话(例如)make<std::pair>(1, 2)我就得到

error: no matching function for call to 'make(int, int)'
Run Code Online (Sandbox Code Playgroud)

我在这里的语法错了吗?
或者这是对的,海湾合作委员会是错的吗?
或者这在C++ 0x中根本不可能?

[编辑]

建议N2555似乎表明这是允许的,海湾合作委员会声称已在GCC4.4中实施.

Joh*_*itb 37

这是完全正确的.我希望它能起作用.所以我认为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]$
Run Code Online (Sandbox Code Playgroud)

  • 看起来我终于可以看看clang :-) (3认同)

Luc*_*ton 7

这可能是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 */ }
Run Code Online (Sandbox Code Playgroud)