web-dev-qa-db-ja.com

型の同等性をチェックするためのコンパイル時関数

型の同等性をチェックするための自己完結型のコンパイル時関数を実装する必要があります(引数のない関数テンプレート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; 
}
15
user2452809

とても簡単です。型特性とヘルパー関数を定義するだけです。

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; }

これが 実例 です。

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 は、ほとんど同じことを行うので、標準ライブラリの一部として利用できることに注意してください。

26
Andy Prowl

魔法のGCC拡張機能を使用せずに、Cでこれを行う方法は次のとおりです。

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

例えば:

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

yintでない場合、コンパイルエラーがトリガーされます。
説明については、 ここ を参照してください。

3
Igor Skochinsky