代码之家  ›  专栏  ›  技术社区  ›  turoni

c++按值传递模板化的唯一路径

  •  0
  • turoni  · 技术社区  · 5 年前

    我可以这样做:

    #include <memory>
    
    struct Base{};
    
    struct Derived : public Base
    {};
    
    void foo(std::unique_ptr<Base> sink)
    {    
    }
    
    int main(){
        foo(std::make_unique<Derived>());    
    
        return 0;
    }
    

    但是,如果我想用“派生”作为模板来执行此操作,则不再编译:

    #include <memory>
    
    struct Dummy
    {};
    
    template<class D>
    struct Base{};
    
    template<class D>
    struct Derived : public Base<D>
    {};
    
    template<class D>
    void foo(std::unique_ptr<Base<D>> sink)
    {    
    }
    
    int main(){
        foo(std::make_unique<Derived<Dummy>>()); //does not compile    
        //foo(std::unique_ptr<Base<Dummy>>(new Derived<Dummy>())); // compiles
    
        return 0;
    }
    

    foo(std::unique_ptr<Base<Dummy>>(new Derived<Dummy>()));
    

    不过,这似乎有点不对。


    还有没有其他方法让我错过了如何使用模板化类而不需要使用裸指针?

    编译 mcve1
    编译 mcve2

    0 回复  |  直到 5 年前
        1
  •  5
  •   João Paulo    5 年前

    在这种情况下,编译器无法推断类型。您可以通过传递类型来帮助它:

    foo<Dummy>(std::make_unique<Derived<Dummy>>());
    

    但是如果你宣布 foo

    template <template<class, class> class X, class Y, class Z>
    void foo(X<Y,Z> sink) {}
    

    或者像这样:

    template<class D, class S>
    void foo(std::unique_ptr<D, S> sink){}
    

    foo(std::make_unique<Derived<Dummy>>());
    foo(std::unique_ptr<Base<Dummy>>(new Derived<Dummy>()));