2010-08-30 23 views
5

ad alanı üye varlığını test etmek için sfinae kullanmanın mümkün olup olmadığını anlamaya çalışıyordum. Google, bu konuda oldukça sessiz. Aşağıdaki kodu denedim, ancak başarısız oluyor.ad alanı üyeleri varlığını test etmek için sfinae kullanın

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); 
}; 

Neden olursa olsun?

Saygılarımızla,

cevap

10

Hayır, işe yaramadı. Ayrıca, SFINAE'yi böyle bir şekilde kullanmanın bir yolu da yoktur (bu, en son C++ 0x bileşenine karşı bir uyumluluk testi için usenet üzerinde tartışılmıştır). xyz::C'un içindeki C, şablon parametresiyle ilgili değildir.

Şablonların yalnızca makro olmadığını unutmayın. C parametresi yalnızca bir metin parçasını değil, semantik bir varlıkları ifade eder. Bu durumda bir türüdür. Zaten argüman olarak sahip olduğu anlama bağlı. Yani, sınıfınız abc adında bir üye olsaydı, parametrenin anlamı hala değişmezdi.

istediğin varsa bazı yapı xyz::abc kullanmak ise

ve aksi others::abc, oraya ulaşmak için bazı numaralar yapabilirim, ama ben xyz

namespace others { 
    struct abc{}; 
} 

namespace fallbacks { 
    using others::abc; 
} 

namespace xyz { 
    using namespace fallbacks; 
} 
dokunmadan yapar şekilde farkında değilim

xyz::abc ve xyz derken, bildirilen bir üye içeriyorsa, bu üyeye başvuracaktır (bu üye fallbacks numaralı telefonu gizleyecektir. Ancak bu üyeyi içermiyorsa, kullanım yönergesinin adı bulunacaktır. ve bakınız fallbacks::abc.