我目前正在玩模板元編程。我試圖通過使用tmp來創建一個有限狀態機。我知道網絡中有幾種實現方式,但我想自己實現一種實踐方式。C++展開可變參數模板參數到一個語句
我有一個叫做Condition
的類,它是兩個狀態之間轉換條件的基類。一種實現方式是AnyCondition
類:
template<class Input, Input comp, Input ... comps >
class AnyCondition: public Condition<Input>
{
public:
AnyCondition() {}
bool operator()(const Input& input) const override
{
return input == comp || AnyCondition<Input, comps...>()(input);
}
};
這裏的問題是,編譯器將擴大這個recursivly,這導致了很多在運行時由於input
參數遞歸調用。它應該更有效率,如果擴展的代碼將是一個像這樣的陳述:
bool operator()(const Input& input) const override
{
return input == comp1 || input == comp2 || input == comp3...
}
這是可能以某種方式?
你可以使用的va_list通過它們使用循環並檢查每個comp值? – Abhinav
我現在無法測試它,但是您確定編譯器在使用優化進行編譯時仍然使用遞歸調用嗎? –
我不認爲*編譯器會以遞歸方式擴展*,但它會在編譯時將其擴展爲您想要的代碼。你測試過了嗎? – Walter