11

型に静的メンバー変数があるかどうかを検出するために、以下のコードを作成しました。残念ながら、変数が存在しないことを常に返しています。

誰かが私が間違っているところを教えてもらえますか? g++ 4.7.1 を使用しています。

#include <iostream>
#include <utility>
#include <type_traits>

using namespace std;

template <class T>                                                  
class has_is_baz                                                          
{                                                                   
    template<class U, 
             typename std::enable_if<std::is_same<bool, decltype(U::is_baz)>::value>::type...>                    
        static std::true_type check(int);                           
    template <class>                                                
        static std::false_type check(...);                          
public:                                                             
    static constexpr bool value = decltype(check<T>(0))::value;     
};

struct foo { };

struct bar 
{ 
    static constexpr bool is_baz = true;
};

int main()
{
    cout << has_is_baz<foo>::value << '\n';
    cout << has_is_baz<bar>::value << '\n';
}
4

2 に答える 2

11

主な問題は次のとおりです。

std::is_same<bool, decltype(bar::is_baz)>::value == false

その後、SFINAEは常に失敗していました。has_is_bazトレイトを書き直しましたが、機能するようになりました。

#include <iostream>
#include <utility>
#include <type_traits>

using namespace std;

template <class T>                                                  
class has_is_baz                                                          
{       
    template<class U, class = typename std::enable_if<!std::is_member_pointer<decltype(&U::is_baz)>::value>::type>
        static std::true_type check(int);
    template <class>
        static std::false_type check(...);
public:
    static constexpr bool value = decltype(check<T>(0))::value;
};

struct foo { };

struct bar 
{ 
    static constexpr bool is_baz = true;
};

struct not_static {
    bool is_baz;
};

int main()
{
    cout << has_is_baz<foo>::value << '\n';
    cout << has_is_baz<bar>::value << '\n';
    cout << has_is_baz<not_static>::value << '\n';
}

編集:タイプ特性を修正しました。@litbが示すように、静的メンバーと非静的メンバーを検出していました。

于 2012-08-13T00:55:22.100 に答える
5

コードの問題は、constexprオブジェクトが暗黙的constに存在することです。つまり、同じタイプのテストは次のようになります。

std::is_same<const bool, decltype(U::is_baz)>::value

これは、§7.1.5[dcl.constexpr]/9の標準で指定されています

オブジェクト宣言で使用されるconstexpr指定子は、オブジェクトをconstとして宣言します。[...]

于 2012-08-13T01:56:18.450 に答える