Здравствуйте, T4r4sB, Вы писали:
EP>>Да, здорово, вот только на Clang что-то не заводится. TB>Судя по выхлопу, strings очищается перед вызовом мейна?!
Видимо не очищается, а просто конструируется позже run_it, хотя по идее должен раньше (можно попробовать сделать тест с порядком вызова конструкторов).
С синглтоном Майерса работает и на Clang.
EP>Видимо не очищается, а просто конструируется позже run_it, хотя по идее должен раньше (можно попробовать сделать тест с порядком вызова конструкторов).
Здравствуйте, B0FEE664, Вы писали:
BFE>А вот, только что придумал:
BFE>template<class T> BFE>T x = T{};
BFE> Test t = x<Test>;
Кто разъяснит, как это работает? Ведь до инициализации Test исполнение кода не доходит, почему же T<> инициализируется?
Какая связь между инстанцированием шаблона (T, StrMap) в локальном коде и инициализацией глобальной переменной?
Здравствуйте, flаt, Вы писали:
BFE>>А вот, только что придумал: BFE>>template<class T> BFE>>T x = T{};
BFE>> Test t = x<Test>;
F>Кто разъяснит, как это работает? Ведь до инициализации Test исполнение кода не доходит, почему же T<> инициализируется? F>Какая связь между инстанцированием шаблона (T, StrMap) в локальном коде и инициализацией глобальной переменной?
x — это глобальная переменная, следовательно она должна быть инициализирована в глобальном пространстве. То, что определение класса лежит где-то ещё не столь важно.
Дело тут даже не столько в том, что введены шаблонные переменные, а в том, что теперь в качестве параметра шаблона можно указать локальный класс. В сообщении trick, выше, это видно.
С этим кодом, кстати, возможна проблема из-за порядка инициализации глобальных переменных. Для надёжности, x следует сделать константой: const T x = T{};
F>Куда ткнуться почитать?
Не знаю, я стандарт просматривал...
Здравствуйте, B0FEE664, Вы писали: BFE>Может уже появился какой способ собрать указатели на локальные строки в глобальных переменных ? (Например, шаблон параметризованный локальной строкой...)
Это и в С++11 можно было сделать.
Вот ты там писал, что это можно использовать для перевода приложения.
Понравилась твоя идея, вот мой концепт реализации (работает в GCC и СLang c С++11).
В принципе даже контейнеры не понадобились.
Вспомогательная кухня, применил тут кое-какие свои давние идеи по реализации настоящих ct-строк:
SETUP_TR могут находиться в любом файле. Допустим, можно завести russian_tr.cpp и там написать перевод для нужных строк.
В продвинутой реализации можно было бы уйти от голых указателей и сделать свой класс "переводной" строки.
Тест "одним файлом" в онлайн компиляторе: http://rextester.com/WYUMS67445
Может быть будет полезно.
Да, именно.
Насчет constexpr функции с auto — то это работает только в С++14.
А приемы эти я изобретал еще на C++0x.
Можно применить вот такой вариант для С++11, если все еще есть сомнения насчет легитимности.
struct X
{
typedef decltype("abc") type;
static constexpr type chars() { return"abc"; }
};
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Его можно без проблем заменить на const char *, auto там исключительно для удобства.
Точно не вспомню пример, но иногда это не работало.
Возможно это были временные баги компиляторов, не помню уже.
Последний раз с этим всерьез возился кажется в 12 году.
Здравствуйте, B0FEE664, Вы писали:
BFE>В том-то и дело, что тип таких переменных не зависит от их специализации. Просто у этих переменных имена сложные, составные.
А в len<meter> можно явно/неявно присвоить len<centimeter> ?
Здравствуйте, rus blood, Вы писали:
BFE>>В том-то и дело, что тип таких переменных не зависит от их специализации. Просто у этих переменных имена сложные, составные. RB>А в len<meter> можно явно/неявно присвоить len<centimeter> ?
Да. Можно явно присвоить. len<meter> = len<centimeter>; присвоит значение len<centimeter> в len<meter>. Поэтому я и говорю, что это просто имена переменных.