檢查類是否具有給定簽名的成員函數。我要求一個模板技巧來檢測一個類是否具有給定簽名的特定成員函數。這個問題與這里引用的問題相似。http://www.gotw.ca/gotw/071.htm但情況并非如此:在薩特的書中,他回答了一個問題:C類必須提供一個具有特定簽名的成員函數,否則程序將無法編譯。在我的問題中,如果一個類有這個功能,我需要做一些事情,否則我需要做一些“其他的事情”。Boost:序列化也面臨類似的問題,但我不喜歡他們采用的解決方案:默認情況下,模板函數用特定的簽名調用一個空閑函數(必須定義),除非您用特定的簽名定義了一個特定的成員函數(在他們的情況下,“序列化”使用了給定類型的2個參數),否則會發生編譯錯誤。即實現侵入式序列化和非侵入式序列化。我不喜歡這個解決方案有兩個原因:要成為非侵入性的,您必須重寫Boost:序列化命名空間中的全局“序列化”函數,因此您可以在客戶端代碼中打開命名空間Boost和命名空間序列化!解決這個混亂的堆棧是10到12個函數調用。我需要為沒有該成員函數的類定義一個自定義行為,并且我的實體位于不同的名稱空間中(我不想覆蓋在一個名稱空間中定義的全局函數,而我在另一個名稱空間中)你能給我一個解決這個難題的提示嗎?
3 回答
當年話下
TA貢獻1890條經驗 獲得超9個贊
template<typename T>struct HasUsedMemoryMethod{
template<typename U, size_t (U::*)() const> struct SFINAE {};
template<typename U> static char Test(SFINAE<U, &U::used_memory>*);
template<typename U> static int Test(...);
static const bool Has = sizeof(Test<T>(0)) == sizeof(char);};template<typename TMap>void ReportMemUsage(const TMap& m, std::true_type){
// We may call used_memory() on m here.}template<typename TMap>void ReportMemUsage(const TMap&, std::false_type)
{}template<typename TMap>void ReportMemUsage(const TMap& m){
ReportMemUsage(m,
std::integral_constant<bool, HasUsedMemoryMethod<TMap>::Has>());}- 3 回答
- 0 關注
- 479 瀏覽
添加回答
舉報
0/150
提交
取消
