Подтвердить что ты не робот

Функция времени компиляции для проверки равенства типов

Мне нужно реализовать автономную функцию времени компиляции для проверки равенства типов (шаблон функции без аргументов 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; 
}
4b9b3361

Ответ 1

Это довольно просто. Просто определите тип и вспомогательную функцию:

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

Вот живой пример.

В С++ 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, которая делает почти то же самое, доступна как часть стандартной библиотеки.

Ответ 2

Здесь вы можете сделать это на C без каких-либо магических расширений GCC:

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

Например:

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

Вызывает ошибку компиляции, если y не int.
Для объяснения см. здесь.