Мне нужно реализовать самодостаточную функцию времени компиляции для проверки равенства типов (шаблон функции без аргументов 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;
}
Это довольно просто. Просто определите черту типа и вспомогательную функцию:
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_type
а также std::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
, который делает почти то же самое, доступен как часть стандартной библиотеки.
Вот как вы можете сделать это в C, без каких-либо волшебных расширений GCC:
#define CHECKED_TYPE(original_type, p) ((conversion_type*) (1 ? p : (original_type*) 0))
Например:
void *q = CHECKED_TYPE(int, &y);
Вызовет ошибку компиляции, если y
не является int
,
Для объяснения см. Вот.