2012-11-12 19 views

cevap

1

Bulunan çalışır versiyon:

template <typename C> static one test(decltype(((C*)0)->AnyFunc())*) ; 

sen const fonksiyonu, bunu kullan ettiğini nesneyi doğrulamak isterseniz: argümanlarla

template <typename C> static one test(decltype(((const C*)0)->AnyFunc())*) ; 

bu sürümü algılamaz fonksiyonu:

class B : public std::vector<int> 
{ 
public: 
    //void AnyFunc() const; 
    //void AnyFunc(); 
    int AnyFunc(int); 
}; 
+1

@Klaus Bu yüzden decltype() 'dan sonra' * 'ekledim ... Göndermeden önce çalıştığını kontrol ettim: http://ideone.com/8Tli7t – PiotrNycz

+0

İkinci yanıtı okuduktan sonra çevremde. Çok teşekkürler! – Klaus

+0

Evet, decltype'tan sonra * unuttum! Benim hatam için üzgünüm! Bunu ikinci cevaptan std :: add_pointer arkasına baktıktan sonra çalıştım. – Klaus

2

Bağımsız değişkenler (13.4p1) olmaksızın aşırı yüklenmiş işlev adının kullanılması şarkıya çözümlenmelidir. le aşırı yükleme (13.4p4), aksi takdirde ikame hatası meydana gelecektir. Eğer variadic şablonu ve result_of benzer bir desen kullanabilirsiniz Genelde

template <typename C> static one test(
     typename std::add_pointer<decltype(std::declval<C>().AnyFunc())>::type); 

:

o zaman sen bunu aramak için plan argümanları bilmelidir üye işlevin varlığı için test ediyorsanız :

template <typename C, typename... Args> static one test(
     typename std::add_pointer<decltype(
      std::declval<C>(std::declval<Args>()...).AnyFunc())>::type); 

add_pointer kullanmak, bu fonksiyon argüman türleri olarak izin verilen değil işlev dönüş türleri ile çalışma olanağı sağlar (örneğin void).

İlgili konular