亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

SFINAE檢查繼承的成員函數

SFINAE檢查繼承的成員函數

C++
慕的地10843 2019-10-06 14:15:21
使用SFINAE,我可以檢測給定類是否具有某些成員函數。但是,如果我想測試繼承的成員函數怎么辦?以下內容在VC8和GCC4中不起作用(即檢測到A具有成員函數foo(),但不能B繼承成員函數):#include <iostream>template<typename T, typename Sig>                                 struct has_foo {                         template <typename U, U> struct type_check;    template <typename V> static char (& chk(type_check<Sig, &V::foo>*))[1];    template <typename  > static char (& chk(...))[2];     static bool const value = (sizeof(chk<T>(0)) == 1);};struct A {    void foo();};struct B : A {};int main(){    using namespace std;    cout << boolalpha << has_foo<A, void (A::*)()>::value << endl; // true    cout << boolalpha << has_foo<B, void (B::*)()>::value << endl; // false}那么,有沒有辦法測試繼承的成員函數?
查看完整描述

3 回答

?
蠱毒傳說

TA貢獻1895條經驗 獲得超3個贊

joshperry的回答非常聰明和優雅,但是(如后文所述)它不能正確檢查foo()的簽名,并且不能與基本類型(如int)一起使用:這會導致編譯器錯誤。我將提出一種可以正確處理繼承的成員并檢查成員函數簽名的技術。我將不做詳細介紹,而是給您兩個示例,并希望代碼能說明一切。


范例1:

我們正在檢查具有以下簽名的成員:  T::const_iterator begin() const


template<class T> struct has_const_begin

{

    typedef char (&Yes)[1];

    typedef char (&No)[2];


    template<class U> 

    static Yes test(U const * data, 

                    typename std::enable_if<std::is_same<

                             typename U::const_iterator, 

                             decltype(data->begin())

                    >::value>::type * = 0);

    static No test(...);

    static const bool value = sizeof(Yes) == sizeof(has_const_begin::test((typename std::remove_reference<T>::type*)0));

};

請注意,它甚至檢查方法的一致性,并且也適用于原始類型。(我的意思has_const_begin<int>::value是假的,不會引起編譯時錯誤。)


例子2

現在我們正在尋找簽名: void foo(MyClass&, unsigned)


template<class T> struct has_foo

{

    typedef char (&Yes)[1];

    typedef char (&No)[2];


    template<class U>

    static Yes test(U * data, MyClass* arg1 = 0,

                    typename std::enable_if<std::is_void<

                             decltype(data->foo(*arg1, 1u))

                    >::value>::type * = 0);

    static No test(...);

    static const bool value = sizeof(Yes) == sizeof(has_foo::test((typename std::remove_reference<T>::type*)0));

};

請注意,MyClass不一定是默認可構造的,也不必滿足任何特殊概念。該技術也適用于模板成員。


我熱切地等待對此的意見。


查看完整回答
反對 回復 2019-10-06
  • 3 回答
  • 0 關注
  • 547 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號