Variadic template templates and perfect forwarding

前端 未结 3 1015
北恋
北恋 2020-12-07 16:24

This question on the object generator pattern got me thinking about ways to automate it.

Essentially, I want to automate the creation of functions like std::ma

相关标签:
3条回答
  • 2020-12-07 17:05

    That's exactly right. I would expect it to work. So I think that GCC is in error with rejecting that. 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]$
    
    0 讨论(0)
  • 2020-12-07 17:14

    This is probably a GCC quirk. I can get the following to work with a dev snapshot (I don't have a copy of 4.6 right now):

    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 */ }
    
    0 讨论(0)
  • 2020-12-07 17:14

    This is quite wrong- take make_shared, for example. The point of make_shared is that there are run-time efficiency savings for using it. But what would happen if I tried to use make<std::shared_ptr>? Don't think that would quite work out. Or how about types where only some of the constructor arguments are template arguments, and the rest aren't? For example, make<std::vector, int>(other_vector.begin(), other_vector.end()); - the types of the iterators don't participate, but you pass them in anyway.

    It's impossible to write a generic make function.

    As for the Standard, well, it could easily have been removed since then. You'd have to check the FDIS.

    0 讨论(0)
提交回复
热议问题