2013-06-04 14 views
13

型平等(型なしの関数テンプレートbool eqTypes<T,S>())をチェックするための自己コンパイル時関数を実装する必要があります。型の等価性をチェックするためのコンパイル時関数

自己完結型はライブラリに依存しないことを意味します。

私はこのすべてで良くありません。それは私が試したものですが、私が必要とするものではありません。

template<typename T> 
bool eq_types(T const&, T const&) { 
return true; 
} 

template<typename T, typename U> 
bool eq_types(T const&, U const&) { 
return false; 
} 
+2

['std :: is_same'](http://en.cppreference.com/w/cpp/types/is_same)を使用することは許可されていますか? – juanchopanza

+0

http://stackoverflow.com/a/3450395/168175では、それを自分で実装する方法を示していますが、構造体の代わりに関数にする必要があります(単純に)。 – Flexo

答えて

23

非常に簡単です。ここで

template<typename T, typename U> 
struct is_same 
{ 
    static const bool value = false; 
}; 

template<typename T> 
struct is_same<T, T> 
{ 
    static const bool value = true; 
}; 

template<typename T, typename U> 
bool eqTypes() { return is_same<T, U>::value; } 

live exampleです:ちょうど型特性とヘルパー関数を定義します。

C++ 11では

、あなたがstd::false_typestd::true_typeを使用することを許可されている場合、あなたはこの方法の上に書き直します:

#include <type_traits> 

template<typename T, typename U> 
struct is_same : std::false_type { }; 

template<typename T> 
struct is_same<T, T> : std::true_type { }; 

template<typename T, typename U> 
constexpr bool eqTypes() { return is_same<T, U>::value; } 

お知らせ、ほとんど同じことをして型特性std::is_same、その標準ライブラリの一部として利用できます。

+0

多型には効果がありません。 –

+0

'constexpr bool eqTypes()'も同様です。 –

+0

@TimothyShields:確かに、私はC++ 03がターゲットであると仮定していました。私はC++の11-ishバージョンを追加します –

2

は、ここでは、任意の魔法のGCC拡張せずに、Cでそれを行うことができます方法は次のとおりです。

#define CHECKED_TYPE(original_type, p) ((conversion_type*) (1 ? p : (original_type*) 0)) 

例えば:yintない場合

void *q = CHECKED_TYPE(int, &y); 

は、コンパイルエラーがトリガされます。
詳細については、hereを参照してください。

関連する問題