【问题标题】:Rebinding a function pointer in copy constructor在复制构造函数中重新绑定函数指针
【发布时间】:2016-11-22 11:45:06
【问题描述】:

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

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

现在,当使用 functionList 复制类时,函数指针仍然指向旧类。 如何将函数指针重新绑定到新类?

这里是一个示例代码:

#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)
    {

    }

};

谢谢!

【问题讨论】:

  • 所以您想在testClass 类型的对象上调用void SubClass::function(const SomeClass&amp;, const SomeClass&amp;),就好像函数在testClass 中声明一样?那行不通...也许您可以更详细地描述您要实现的目标,以便我们找到合适的解决方案!?
  • 不可能“重新绑定”这样的函数。您将不得不重新设计您的课程,以便以其他方式实现您的目标。
  • "现在,当用 functionList 复制 class 时,函数指针仍然指向旧的 class。我怎样才能将函数指针重新绑定到新的?”您可能指的是 object
  • user2079303,谢谢!该链接有帮助

标签: c++ c++11 function-pointers member-function-pointers stdbind


【解决方案1】:

你必须复制你的子类。实际上 - 你只需要在你的复制构造函数中进行默认初始化:

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

如果你的例子是非常简单的例子,那么你需要有自己的function 类和rebind 函数。

[更新]

请记住,重新绑定是您的子类的职责 - 所以,我会这样做:

您的基类应该只有默认副本(您可以不指定 - 默认为默认):

class testClass
{
public:
    ...
    testClass(const testClass&s) = default;
    ...
};

下一步是在您的子类中实现重新绑定:

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

【讨论】:

  • 是的,它被简化了。我可以在从基类调用的虚函数中填充向量。或者我让重新绑定像在另一个线程中一样工作。虽然,还没有成功。
  • 我添加了工作演示,并解释了如何完成“重新绑定”
猜你喜欢
  • 1970-01-01
  • 2010-10-21
  • 2016-04-13
  • 2011-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多