#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, у них такой проблемы нету.
Комментариев нет:
Отправить комментарий