2010-08-30 65 views
5

我試圖弄清楚是否可以使用sfinae來測試命名空間成員存在。谷歌對此非常沉默。我試過下面的代碼,但是失敗了。使用sfinae來測試命名空間成員是否存在

namespace xyz{ 
struct abc{}; 
} 

struct abc{}; 

struct test_xyz{ 
typedef char yes; 
typedef struct{ char a[2]; } no; 

template <class C> static yes test(xyz::C = xyz::C()); //lets assume it has default constructor 
template <class C> static no test(...); 

const bool has_abc = sizeof(test_xyz::test<abc>()) == sizeof(yes); 
}; 

任何想法爲什麼?

Regards,

回答

10

不,這是行不通的。也沒有辦法以這種方式使用SFINAE(這是上次在usenet上針對某些C++ 0x組件進行兼容性測試的討論)。 xyz::C中的C與模板參數完全無關。

請記住,模板不只是宏。參數C表示不僅僅是一段文本,而是一個語義實體。在這種情況下,它是一種類型。它的含義已經與它作爲論據的含義有關。也就是說,如果你的班級有名字abc的成員,參數的含義仍然不會改變。

如果你想要的是,如果它存在使用一些結構xyz::abc,並others::abc否則,你可以做一些技巧去那裏,但我不知道的,做它沒有觸及xyz

namespace others { 
    struct abc{}; 
} 

namespace fallbacks { 
    using others::abc; 
} 

namespace xyz { 
    using namespace fallbacks; 
} 
方式

現在如果你說xyz::abcxyz包含一個聲明的成員,它將引用該成員(該成員將隱藏在fallbacks中的成員,但如果它不包含該成員,則會找到using指令的名稱並參考fallbacks::abc

相關問題