如何传递指向构造函数的函数指针?

新手上路,请多包涵

我正在努力在 C++ 中实现反射机制。我的代码中的所有对象都是 Object(我自己的泛型类型)的子类,其中包含 Class 类型的静态成员数据。

 class Class{
public:
   Class(const std::string &n, Object *(*c)());
protected:
   std::string name;     // Name for subclass
   Object *(*create)();  // Pointer to creation function for subclass
};

对于具有静态类成员数据的 Object 的任何子类,我希望能够使用指向该子类的构造函数的指针来初始化“create”。

原文由 Kareem 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 967
2 个回答

您不能获取构造函数的地址(C++98 标准 12.112 构造函数 - “12.1-12 构造函数 - “不应获取构造函数的地址。”)

您最好的选择是拥有一个创建 Object 并传递工厂地址的工厂函数/方法:

 class Object;

class Class{
public:
   Class(const std::string &n, Object *(*c)()) : name(n), create(c) {};
protected:
   std::string name;     // Name for subclass
   Object *(*create)();  // Pointer to creation function for subclass
};

class Object {};

Object* ObjectFactory()
{
    return new Object;
}

int main(int argc, char**argv)
{
    Class foo( "myFoo", ObjectFactory);

    return 0;
}

原文由 Michael Burr 发布,翻译遵循 CC BY-SA 2.5 许可协议

使用可变参数模板,您可以创建一个包装器,它将构造函数转换为函子。

 #include <utility>

template <typename T>
struct BindConstructor{
    template<typename... Args>
    T operator()(Args&&...args)const{
        return T(std::forward<Args>(args)...);
    }
};

struct Foo {
    Foo(int a, int b):a(a),b(b){}
    int a;
    int b;
};

template <typename Fn>
auto Bar(Fn f){
    return f(10,20);
}

int main(){
    Foo foo = Bar(BindConstructor<Foo>());
}

https://godbolt.org/z/5W383McTc

原文由 bradgonesurfing 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题