模板参数从范围解析推导

问题描述 投票:0回答:1

我的基类和派生类如下

class Disposable : public PolymorphicE
{
protected:
    virtual void Created() {}
    virtual void Disposing() {}
public:
    template <typename DisposableClass, typename ... Args>
    static DisposableClass* Create(Args&& ... constructorArgs)
    {
        DisposableClass* result = new DisposableClass(std::forward<Args>(constructorArgs)...);
        result->Created();
        return result;
    }

    void Dispose()
    {
        Disposing();
        delete this;
    }
};

class MyClass : public Disposable
{
public:
    MyClass(int param1, double param2) {}
};

这就是我创建对象的方式

MyClass::Create<MyClass>(45, 23.74);

//i want it this way instead
MyClass::Create(45, 23.74);

我读到(从一个不相关的主题)“从“::”的左侧推导是不可能的。 有没有其他方法可以实现这个(如果我不能从“::”的左侧推断出它)所以我可以创建这样的对象“MyClass::Create(45, 23.74);”

(我意识到编译器不会知道我使用静态基类方法的真实意图,所以它可以理解它是一个构造函数并帮助我推导,但我希望可能有一些帮助关键字或标准库语法克服这类问题)

c++ template-argument-deduction
1个回答
2
投票

这方面的典型方法是奇怪的重复模板模式(CRTP):

class Disposable : public PolymorphicE
{
protected:
    virtual void Created() {}
    virtual void Disposing() {}
public:
    void Dispose()
    {
        Disposing();
        delete this;
    }
};

template<typename Derived>
struct DisposableWithCreate : public Disposable
{
    template <typename ... Args>
    static Derived* Create(Args&& ... constructorArgs)
    {
        Derived* result = new Derived(std::forward<Args>(constructorArgs)...);
        result->Created();
        return result;
    }
};

class MyClass : public DisposableWithCreate<MyClass>
{
public:
    MyClass(int param1, double param2) {}
};

现在无需在从

Create
Disposable
派生的每个类中定义
DisposableWithCreate
即可工作。

© www.soinside.com 2019 - 2024. All rights reserved.