2011-12-13 13 views
6

テンプレート引数が参照型かどうかはC++ 03でチェックしたいと思います。 (すでにC++ 11とBoostにはis_referenceがあります)。テンプレート引数が参照かどうかの確認[C++ 03]

私はSFINAEと、参照へのポインタを持つことができないという事実を利用しました。ここで

は、私の解決策

#include <iostream> 
template<typename T> 
class IsReference { 
    private: 
    typedef char One; 
    typedef struct { char a[2]; } Two; 
    template<typename C> static One test(C*); 
    template<typename C> static Two test(...); 
    public: 
    enum { val = sizeof(IsReference<T>::template test<T>(0)) == 1 }; 
    enum { result = !val }; 

}; 

int main() 
{ 
    std::cout<< IsReference<int&>::result; // outputs 1 
    std::cout<< IsReference<int>::result; // outputs 0 
} 

はそれで任意の特定の問題でしょうか?誰かが私によりよい解決策を提供できますか?それはあなたのソリューションよりも単純なようだ私には

//! compile-time boolean type 
template< bool b > 
struct bool_ { 
    enum { result = b!=0 }; 
    typedef bool_ result_t; 
}; 

template< typename T > 
struct is_reference : bool_<false> {}; 

template< typename T > 
struct is_reference<T&> : bool_<true> {}; 

+1

完全にするために、あなたはすなわち 'IsReference :: result'、参照ポインタのためのテストケースを追加することができます。 – iammilind

答えて

7

数年前、私はこれを書きました。

ただし、数回しか使用されておらず、何か不足している可能性があります。

+0

私は専門化を避けたかったです。それでも良い解決策です。既にupvoted。 –

+0

@PrasoonSaurav:学習を避けますか? – GManNickG

+0

@GMan:いくつかの*未知の理由のため、私はこのクラスを専門にすることはできません:P [これは学習目的であり、実世界のコードとは関係ありません]。 –

15

あなたは、この非常に簡単に行うことができます。

template <typename T> struct IsRef { 
    static bool const result = false; 
}; 
template <typename T> struct IsRef<T&> { 
    static bool const result = true; 
}; 
+0

+1。 –

+0

クラスを専門化せずに同じことをする方法はありますか? –

+0

@ PrasoonSaurav、このソリューションはSFINAEの非常に簡単な方法を提供します。正しい結果が保証されるとき、専門化の問題は何ですか?実際には、このソリューションを[r ++ value in C++ 11](http://www.ideone.com/JHThh)に拡張することができます。 – iammilind

関連する問題