考慮下面的代碼:如何使用Boost MPL在函數中有多個返回點?
struct Param {};
struct Base {
virtual char f(Param const &) const = 0;
};
struct A : Base {
explicit A(Param const &) {}
virtual char f(Param const &) const {return 'A';}
};
struct B : Base {
explicit B(Param const &) {}
virtual char f(Param const &) const {return 'B';}
};
struct C : Base {
explicit C(Param const &) {}
virtual char f(Param const &) const {return 'C';}
};
char my_function(Param const & param, Base const & base)
{
if(A const * const p = dynamic_cast<A const *>(&base)) {
return p->f(param);
}
if(B const * const p = dynamic_cast<B const *>(&base)) {
return p->f(param);
}
if(C const * const p = dynamic_cast<C const *>(&base)) {
return p->f(param);
}
return '0';
}
然後如果我寫
Param x, y;
std::cout << my_function(x, B(y)) << std::endl;
它輸出B
。
我的目標是更改my_function
的實現,以便它可以支持在編譯時定義的一組子類型Base
。在這裏,我手寫了我將爲{A, B, C}
類型獲得的擴展代碼。 我想模板化my_function
有一組類型,並調用它是這樣的:
std::cout << my_function<boost::mpl::set<A, B, C> >(x, B(y)) << std::endl;
輸出B
,或者,如:
std::cout << my_function<boost::mpl::set<A, C> >(x, B(y)) << std::endl;
輸出0
。
我不知道使用哪個MPL構造來實現此結果。
我最初以爲find_if
一個電話可以讓找到集合到base
可以dynamic_casted第一類,但實際上這個算法,最喜歡的MPL算法,靜態顯然產生了效果,因此不能與運行時參數一起使用(base
)。
分類爲「運行時」的唯一MPL算法是for_each
,但我無法弄清楚如何使用它來產生與我的多重返回語句相同的效果(我甚至不知道它是否是它是可能的)。 感謝任何能幫助我的MPL演講者。
PS:不要告訴我,我應該避免動態蒙上或我可以簡單地
char my_function(Param const & param, Base const & base) {return base.f(param);}
我簡單跟我現實生活中的問題相比,代碼示例,我不能改變現有的設計。
謝謝你的回答。您的解決方案的缺點是每次都會遍歷整個類型列表,但它很好地展示瞭如何使用MPL for_each。同時,我找到了我發佈的解決方案(不使用MPL算法)。 –