C++ 将构造函数作为回调参数或返回值传递
基本上,我要做的是制造一流的工厂:C++ 将构造函数作为回调参数或返回值传递,c++,constructor,callback,C++,Constructor,Callback,基本上,我要做的是制造一流的工厂: class SomeClass { // Returns subclass of SomeClass by given name, or nullptr static SomeClass* childFromString(const std::string&); } 我将使用if…else查找实际的子类,其中大约有5个。但为了推迟安装,我想返回构造函数而不是引用: class SomeClass { // This is an
class SomeClass {
// Returns subclass of SomeClass by given name, or nullptr
static SomeClass* childFromString(const std::string&);
}
我将使用if…else
查找实际的子类,其中大约有5个。但为了推迟安装,我想返回构造函数而不是引用:
class SomeClass {
// This is an attempt to define "returns constructor of SomeClass"
static (SomeClass)(int) childFromString(const std::string&);
}
将用作:
SomeClass* = new (SomeClass::childFromString("Child"))(someNumber);
<>这在C++中看起来很奇怪,但是在JavaScript或java中是合法的。我不认为它需要反射才能工作,构造函数只是一个函数,对吗
所以再一次,如何将构造函数函数作为参数或返回值传递?由于 构造函数没有名称
您可以在函数中构造对象,也可以返回指向某个创建者的函数指针。来自C++98标准12.1/12构造函数: 不得使用建造商的地址
构造函数不是“正确”的函数。注意:同样的情况适用于析构函数。,不能将函数指针传递给C++中的构造函数。一种理想化的方法是返回延迟构造的std::函数:
struct ChildInterface {
// your interface here
virtual ~Interface() = default;
};
struct Paul : public Interface {
// implementation of interface
};
std::function<Interface*()> getDeferedFactoryFor(const std::string& child)
{
if (child == "paul") {
return []() {
return new Paul();
};
}
if (child == "kara") {
return []() {
return new Kara();
};
}
// more children here
// error handling
return []() {
return nullptr;
}
}
// usage example
void createChild()
{
auto childCreator = getDeferedFactoryFor("paul");
ChildInterface * paul = childCreator();
paul->doSomeThing();
}
struct-ChildInterface{
//你的界面在这里
virtual~Interface()=默认值;
};
结构Paul:公共接口{
//接口的实现
};
std::函数getDeferedFactoryFor(const std::string和child)
{
如果(孩子=“保罗”){
返回[](){
返回新的Paul();
};
}
如果(儿童=“卡拉”){
返回[](){
返回新的Kara();
};
}
//这里有更多的孩子
//错误处理
返回[](){
返回空ptr;
}
}
//用法示例
void createChild()
{
auto childCreator=getDeferedFactoryFor(“保罗”);
ChildInterface*paul=childCreator();
paul->doSomeThing();
}
请注意,如果不这样做,有很多方法可以解决我的问题,但我很好奇这是否可行以及如何实现。我很好奇构造器是如何工作的,这看起来是一个很好的练习,可以了解更多。你不能传递或直接调用构造器。构造器没有名字。谢谢,我总有一天会使用它,太好了!:)