我有一个带有函数指针列表的类。
这些函数指针指向子类的成员函数,其绑定(bind)方式如下:

functionList.push_back(std::bind(&SubClass::function, this, std::placeholders::_1,    std::placeholders::_2));

现在,在复制带有functionList的类时,函数指针仍指向旧类。
如何将函数指针重新绑定(bind)到新类?

这里是一个示例代码:
#include <vector>
#include <functional>

class SomeClass
{

};

class testClass
{
public:
    typedef std::function<void(const SomeClass& var1, const SomeClass& var2)> transitionFunction;




    testClass(){}
    testClass(const testClass&s)
    {
        for(transitionFunction func : s.functionList)
        {
            // how to rebind the function pointer to the new this?
            functionList.push_back("???");
        }
    }

    std::vector<transitionFunction> functionList;


};


class SubClass : public testClass
{
    SubClass()
    {
        functionList.push_back(std::bind(&SubClass::function, this, std::placeholders::_1,    std::placeholders::_2));
    }

    void function(const SomeClass& var1, const SomeClass& var2)
    {

    }

};

谢谢!

最佳答案

您必须复制子类。实际上-您只需要复制构造函数中的默认初始化即可:

class SubClass : public testClass
{
    ...
    SubClass(const SubClass&) : SubClass()
    {}
    ...
};

如果您的示例是非常简化的示例,那么您需要具有自己的function类和rebind函数。

[更新]

请记住,重新绑定(bind)是子类的职责-因此,我将执行以下操作:

您的基类应该只具有默认副本(您可以不指定此副本-默认为默认):
class testClass
{
public:
    ...
    testClass(const testClass&s) = default;
    ...
};

下一步是在子类中实现重新绑定(bind):
class SubClass : public testClass
{
public:
    using transitionFunctionRebindable =
          std::function<void(SubClass*, const SomeClass&, const SomeClass&)>;

    struct FunctionWrapper
    {
        void operator()(const SomeClass& var1, const SomeClass& var2)
        {
            function(thisObject, var1, var2);
        }

        SubClass* thisObject;
        transitionFunctionRebindable function;
    };

    transitionFunction rebind(transitionFunction& function)
    {
        FunctionWrapper* fr = function.target<FunctionWrapper>();
        if (fr)
        {
            return FunctionWrapper{this, fr->function};
        }
        else
        {
            // in case your base class added something out of your control
            return function;
        }
    }

施工变化一点:
    SubClass()
    {
        functionList.push_back(FunctionWrapper{this, std::bind(&SubClass::function, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)});
    }

然后,复制您的子类:
    SubClass(const SubClass& source) :  testClass(source)
    {
        for (auto& f: functionList)
            f = rebind(f);
    }

工作demo

10-01 17:05
查看更多