我想爲不同的Controller
創建Frontend
模板類。該Frontend
應該使用Controller
的實施方法(如果可用)(即功能的支持),以及一個默認的,否則,在使用模板參數的實現(如果可用),否則默認爲
template <typename Controller>
class Frontend
{
public:
something()
{
// use Controller::something() if possible
// else use default implementation
}
};
Frontend
將使用類型特徵內部找出更多關於Controller
,- 不應要求
Controller
從任何提供默認實現的基類派生,因爲默認方法實現將需要Frontend
的私有信息。
在Controller
中將會有大約20種方法可能實施。我試圖創建一個提供有關提供實現信息(嵌套)性狀:
// (T: Controller class)
T::supportsFeature<FeatureClass, ...>::type
所以Controller::supportsFeature<>
必須提供告知具體的實現。如果控制器支持功能,則::type
爲std::true_type
,否則爲std::false_type
。爲此,我創建了一個默認結構來禁用任何功能,因此Controller類必須明確啓用它提供的任何功能。這似乎是從Controller
攜帶信息到Frontend
的一個舒適的方式,但它有兩個主要缺點:
很難爲他人(誰最終將提供
Controller
)實施supportsFeature
,因爲一個專業化嵌套traits類必須寫我不知道我應該怎麼evaulate要素的存在在
Frontend::something()
,因爲沒有參數取決於功能的存在 - 我不能提供過載是合理的表現(我不想超載std::true_type
vsstd::false_type
,因爲這根本不會爲自己說話)。我可以簡單地使用if語句並依靠編譯器來刪除死代碼。我是不是該?
所以,總結一下:
- 如何執行有關從模板類參數模板類的方法是否存在信息?
- 基於這些信息,我該如何正確切換實現?
使用一個* * SFINAE檢查以測試給定的類型是否支持功能(即特徵),然後失敗爲默認值。在這裏搜索這個詞,如果你不熟悉,那裏有幾個問題.. – Nim 2014-09-01 09:32:51
你可以看看[Boost.TTI](http://www.boost.org/doc/libs/1_56_0/libs/ tti/doc/html/index.html),尤其是[成員函數內省](http://www.boost.org/doc/libs/1_56_0/libs/tti/doc/html/the_type_traits_introspection_library/tti_detail_has_member_function.html) – Angew 2014-09-01 09:36:31
@ Angew不幸的是,在這個特定的環境(嵌入式)中,我遇到了一些嚴重的問題,因爲一些宏會污染boost模板參數名稱。但我至少應該嘗試一下。 – Christoph 2014-09-01 09:50:32