1

我有一個包含函數指針列表的類。 這些函數指針指向一個子類,這是必然像這樣的成員函數:複製構造函數中的函數指針

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

    } 

}; 

謝謝!

+0

所以,你想調用'testClass'類型的對象上的'void SubClass :: function(const SomeClass&,const SomeClass&)'就好像函數是在'testClass'中聲明的那樣?這將不起作用... 也許你可以用更詳細的方式描述你想要達到的目標,所以我們可能會找到一個合適的解決方案! –

+0

「重新綁定」這樣的功能是不可能的。你將不得不重新設計你的課程,以便以其他方式實現你的目標。 –

+0

「現在,當使用functionList複製**類**時,函數指針仍然指向舊的**類**。如何重新綁定函數指針到新的**類**?」您可能是指* object *來代替。 – user2079303

回答

3

你必須複製你的子類。其實 - 你只需要默認初始化你的拷貝構造函數:

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

在情況下,你的例子是非常簡單的例子,那麼你需要有自己的functionrebind功能。

[更新]

記住,重新綁定是子類的責任 - 所以,我會做這樣的事情:

你的基類應該只是默認副本(您可能不指定本 - 默認爲默認):

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

+0

是的,它被簡化了。我可以在從基類調用的虛函數中完成向量的填充。或者我得到重新綁定工作在其他線程。雖然,還沒有成功。 – veio

+1

我添加了工作演示,說明如何完成「重新綁定」 – PiotrNycz