Information
- Rating
- Does not participate
- Location
- Москва и Московская обл., Россия
- Date of birth
- Registered
- Activity
Specialization
Software Architect
PostgreSQL
C#
C++
Linux
Docker
Kubernetes
High-loaded systems
Designing application architecture
Database design
А можно просто отказаться от плохой практики использования значения по умолчанию в пользу перегрузок и вызова функций согласно их сигнатурам:
А теперь попробуем:
Или даже:
Значения по умолчанию практически ничем не отличаются от макросов, и всего-лишь делают замену на уровне препроцессора с:
на:
Так вот, то о чем вы говорите — это не уровень языка, а уровень препроцессора, производящего еще одну неявную замену, которую будет так же невозможно заметить средствами языка, как и для аргументов по умолчанию.
Неужели c++ недостаточно твердо стоит на двух костылях макросов и значений по умолчанию, что его еще нужно подпереть третьим?
objdump -s -j .rodata sample
и удивитесь…
Куда спрятаны? У вас там default.
Извиняюсь, невнимательно прочитал код, в первом варианте у вас void Add(...), а во втором уже char.
«Простой способ отстрелить всю ногу в C++. А почему бы и нет?»
Впрочем, это не совсем тот случай, на который я хотел бы обратить внимание. Подобная техника может быть крайне полезна не для парсеров, а для ORM, на что и нацелен пример из статьи. Все кто имел дело с статически-типизированными ORM в C++ прекрасно понимают как неудобно определять структуры данных без использования дополнительных препроцессоров.
PS. Кстати, следующую статью я как раз хотел посвятить части библиотеки моего С++ web-фреймворка (который хотелось бы полностью перевести на opensource) — библиотеке для работы с JSON. Однако, возможно более интересной темой была бы реализация ORM, использующего вышеозначенную технику (единственное, что меня смущает, — пока еще неопределенный статус данного типа литералов в будущем стандарте). Что вы думаете?