Страницы

Поиск по вопросам

четверг, 13 февраля 2020 г.

Как проверять, одинаковы или нет имена псевдонимов типов?

#cpp #cpp11


Есть простенький код

typedef int typeint1;
typedef int typeint2;

std::cout << std::is_same::value << std::endl; //true
std::cout << std::is_same::value << std::endl;      //true


Есть ли стандартная шаблонная магия, чтобы проверять сходтсво/различие на уровне
имён псевдонимов? Что-то типа:

std::cout << std::is_same_typedef::value << std::endl; //false
std::cout << std::is_same_typedef::value << std::endl; //true

    


Ответы

Ответ 1



Простое сравнение разных имен реализовать несложно, достаточно сделать stringize: #include #include #define IS_SAME_NAME(A_fist_type, A_second_type) \ (not ::std::strcmp(#A_fist_type, #A_second_type)) int main() { typedef int typeint1; typedef int typeint2; std::cout << IS_SAME_NAME(typeint1, typeint2) << std::endl; //false std::cout << IS_SAME_NAME(typeint1, typeint1) << std::endl; //true return 0; }

Ответ 2



Вряд ли это возможно, ведь int, typeint1 и typeint2 означают один и тот же тип.

Ответ 3



Такое не возможно. Дело в том, что псевдоним не является типом сам по себе, он еще одно обозначение для типа. От сюда следует что std::is_same (как и ни что другое в плюсах) не различает псевдонимы, а только типы.

Ответ 4



Это скорее всего не возможно. Потому что typedef1 и typedef2 неявно преобразовываются в int. Таков стандарт С++. Но, попробуйте использовать strong typedef, у них такой проблемы нету.

Комментариев нет:

Отправить комментарий