我的基类和派生类如下
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);”
(我意识到编译器不会知道我使用静态基类方法的真实意图,所以它可以理解它是一个构造函数并帮助我推导,但我希望可能有一些帮助关键字或标准库语法克服这类问题)
这方面的典型方法是奇怪的重复模板模式(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
即可工作。