M>и например, в другом namespace сделаем аналогичное — будут ли типы одинаковыми с точки зрения компилятора?
А проверить?
M>ЗЫ И в догонку — enum class насколько строг?
Как мая матиматичка.
Здравствуйте, σ, Вы писали:
M>>и например, в другом namespace сделаем аналогичное — будут ли типы одинаковыми с точки зрения компилятора? σ>А проверить?
Проверить конечно можно, но: а) не факт, что я проверю именно то, что в итоге получится в рабочем проекте; б) думал нахаляву ответ получить
Здравствуйте, Marty, Вы писали:
M>и например, в другом namespace сделаем аналогичное — будут ли типы одинаковыми с точки зрения компилятора?
Не просто одинаковыми, а идентичными Т.е. это просто один и тот же тип.
Я даже больше скажу, при вызове функции без использования явной квалификации пространства имен, активируется ADL (Argument Dependent Lookup). Так вот, ADL будет искать кандидата на подстановку в том пространстве имен, где определен реальный тип (в случае UDT), а в пространство имен, где определен алиас, даже не заглянет. Это такие грабли, про которые многие постоянно забывают, почему-то. Ниже иллюстрация:
Здравствуйте, Marty, Вы писали:
АТ>>Некосметические различия проявляются при использовании `using` в "template typedef", где он работает логичнее, чем классическая идиома со `struct`.
Речь идет о задаче, когда из набора каких-то типов и/или констант требуется вывести новый тип. Например, из списка типов формальных параметров вывести сигнатуру функции. Или наоборот, имея сигнатуру функции, получить тип возвращаемого значения... Круг задач чрезвычайно широк. До появления шаблонного варианта using-declaration, эта задача традиционно решалась через объявление шаблонного класса (структуры), и определения вложенного алиаса типа. Потом для доступа к этому вложенному алиасу нужно было указать имя шаблонного класса, фактические параметры шаблона и, наконец, имя самого алиаса через двойное двоеточие. Да, и, как правило, нужно было еще не забыть указать перед всей этой конструкцией ключевое слово typename, в случаях использования врутри других шаблонов. В результате получались довольно громоздкие конструкции, которые существенно загромождали код. Шаблонный вариант using-declaration позволяет сократить такие конструкции до имени с набором шаблонных параметров в угловых скобочках. Но я бы не сказал, что шаблонный using-declaration полностью вытесняет старый подход с шаблонным классом, поскольку, при написании шаблонных метафункций, как правило, требуются специализации, а using-declaration специализации не поддерживает. Поэтому стандартный подход таков: сначала определяем шаблонный класс со всеми необходимыми специализациями и предоставляем к этому набору удобную в использовании обертку в виде using-declaration. Такой подход активно используется в стандартной библиотеке — можно видеть, что большинство шаблонных метафункций-классов имеют пару в виде алиаса с суффиксом '_t': is_same — is_same_t, decay — decay_t, remove_reference — remove_reference_t и т.п.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[4]: Using - это сильный typedef или такой как и раньше?
Здравствуйте, Marty, Вы писали:
АТ>>Некосметические различия проявляются при использовании `using` в "template typedef", где он работает логичнее, чем классическая идиома со `struct`.
M>А вот тут не понял, можно мысль раскрыть?
До того, как в языке повился `using` и, соответственно, возможность использовать его для "template typedef", последний более-менее реализовывался через идиоматический прием со struct:
Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>До того, как в языке повился `using` и, соответственно, возможность использовать его для "template typedef", последний более-меннеереализовывался через идиоматический прием со struct:
Здравствуйте, ArtDenis, Вы писали:
AD>Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>>До того, как в языке повился `using` и, соответственно, возможность использовать его для "template typedef", последний более-меннеереализовывался через идиоматический прием со struct:
AD>При наследовании у компилятора всё получается ) AD>
Это свой комок проблем. Когда речь идет о typedef во всех его проявлениях, я все таки хочу классический typedef, то есть псевдоним, а не новый тип. Я хочу, чтобы `MapToInt<int>` было тем же типом, что и `std::map<int, int>`.
Best regards,
Андрей Тарасевич
Re[6]: Using - это сильный typedef или такой как и раньше?
Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>Это свой комок проблем. Когда речь идет о typedef во всех его проявлениях, я все таки хочу классический typedef, то есть псевдоним, а не новый тип. Я хочу, чтобы `MapToInt<int>` было тем же типом, что и `std::map<int, int>`.
Всё верно. Но в те времена, лично для меня достаточно было "лишь бы компилировалось и работало как надо"
Здравствуйте, ArtDenis, Вы писали:
AD>Всё верно. Но в те времена, лично для меня достаточно было "лишь бы компилировалось и работало как надо"
С наследованием тоже есть свои нюансы. Во-первых, не от всякого типа можно наследоваться. Во-вторых, когда в системе используются какие-то утилиты общего применения (форматирование, сериализация и пр.), они могут перестать работать, потому что вместо ожидаемой перегрузки для std::map начинает подхватываться более общий шаблонный вариант. Да, можно предоставить дополнительные перегрузки, можно подправить существующий набор перегрузок, сделать их более "умными". Но все это дополнительные телодвижения, дополнительное тестирование, которых могло бы не быть.
--
Не можешь достичь желаемого — пожелай достигнутого.