2016-06-08 61 views
0

我想構建傳遞兩個函數與可變參數數目的參數對象:如何在一個構造函數中使用兩個可變參數來綁定兩個函數?

class PhaseSetControlProperty : public ControlProperty { 

    public: 
    template<typename FuncKicked, typename... ArgsKicked, typename FuncActivated, typename... ArgsActivated> 
    PhaseSetControlProperty(const std::vector<std::string> &kickedPhaseNames, const std::vector<std::string> &activatedPhaseNames, FuncKicked funcKicked, ArgsKicked ...argsKicked, FuncActivated funcActivated, ArgsActivated... argsActivated): ControlProperty("PhaseSetControl") 
    { 
    getModel()->addProperty(new StringListProperty("kickedPhaseNames", kickedPhaseNames)); 
    getModel()->addProperty(new StringListProperty("activePhaseNames", activatedPhaseNames)); 

    getModel()->addProperty(new StringListProperty("activated", activatedPhaseNames, funcActivated, argsActivated...)); 
    getModel()->addProperty(new StringListProperty("kicked", kickedPhaseNames, funcKicked, argsKicked...)); 
    } 
}; 

實例化看起來是這樣的:

model->addProperty(new PhaseSetControlProperty(kickedphasenames, activephasenames, &BDlines::kickedPhasesFunctionCallback, this, std::placeholders::_1, &BDlines::activePhasesFunctionCallback, this, std::placeholders::_1)); 

這和std ::佔位符:: _ 1是一個可變argments。

的解決方案之前,看着這樣的:

kicked_property = new FunctionProperty("kicked", &BDlines::kickedPhasesFunctionCallback, this, std::placeholders::_1); 
    activated_property = new FunctionProperty("activated", &BDlines::activePhasesFunctionCallback, this, std::placeholders::_1); 

如何c + +知道哪些參數屬於哪個模板參數?這如何以簡單的方式實現?

我目前的解決方案是使用兩個額外的功能,添加屬性「激活」,然後屬性「踢」,基本上像舊版本,但我只想使用一個單一的電話。

+0

請換行等等。您問題的重要部分不會隱藏在滾動條的後面。 –

回答

0

C++如何知道哪些參數屬於哪個模板參數?

它沒有。這就是爲什麼模板參數包只有在它們是最後一個參數時才能被引用的原因。

這怎麼能以簡單的方式實現?

如果每個組參數,只用於構造屬性,可以只取屬性的參數包:

model->addProperty(new PhaseSetControlProperty(kickedphasenames, activephasenames, 
    new StringListProperty (&BDlines::kickedPhasesFunctionCallback, this, std::placeholders::_1), 
    new StringListProperty (&BDlines::activePhasesFunctionCallback, this, std::placeholders::_1))); 

的有還支持有產者其他種類和數量的額外好處。

0

不知道我是否完全理解了你的問題,但是你可以傳遞函子作爲模板參數而不是分別傳遞函數和參數嗎?所以,你的代碼可能是這樣的:

template<typename FuncKickedFunctor, typename FuncActivatedFunctor> 
    PhaseSetControlProperty(const std::vector<std::string> &kickedPhaseNames, const std::vector<std::string> &activatedPhaseNames, FuncKickedFunctor funcKickedFunctor, FuncActivatedFunctor funcActivatedFunctor): ControlProperty("PhaseSetControl") 
    { 
    getModel()->addProperty(new StringListProperty("kickedPhaseNames", kickedPhaseNames)); 
    getModel()->addProperty(new StringListProperty("activePhaseNames", activatedPhaseNames)); 

    getModel()->addProperty(new StringListProperty("activated", activatedPhaseNames, funcActivatedFunctor)); 
    getModel()->addProperty(new StringListProperty("kicked", kickedPhaseNames, funcKickedFunctor)); 
    } 
2

你可以使用std::tuple<>收集的參數 - 比如

template <typename... Args1, typename... Args2> 
void foo(const tuple<Args1...>& t1, const tuple<Args2...>& t2) { 
    cout << tuple_size<tuple<Args1...>>::value << ' ' << tuple_size<tuple<Args2...>>::value << endl; 
} 

現在傳播到構造元組...

相關問題