Size: a a a

2020 June 26

v

vient in pro.cxx
vient
в итоге так получилось
// .h
class A { ...
   template<typename T> static T array[];
   template<> static int array<int>[2];
   template<> static short array<short>[3];
...}

// .cpp
template<> int A::array<int>[] = { 1, 2 };
template<> short A::array<short>[] = { 3, 4, 5 };
.
источник

АР

Андрей Руссков... in pro.cxx
Andrey Davydov
Без специализаций это еще <type_traits> притянем, так отлично. А когда к int и long добавится short, сделаем вложенный тернарник (мы ж на строчках экономим)?
Про лишний отступ это вообще мощно, в способе с c-array его не было, так как декларации влезали в одну строку и их не приходилось визуально отделять :)
type_traits то зачем? И что, "если влазит в строку то не надо переносить"?
источник

CD

Constantine Drozdov in pro.cxx
Это всё хорошо, задача-то где
источник

ПК

Побитый Кирпич... in pro.cxx
Constantine Drozdov
Это всё хорошо, задача-то где
Как это лучше записать задача :)
источник

ПК

Побитый Кирпич... in pro.cxx
Вернее спор
источник

ПК

Побитый Кирпич... in pro.cxx
Вернее срач
источник

AD

Andrey Davydov in pro.cxx
Андрей Руссков
type_traits то зачем? И что, "если влазит в строку то не надо переносить"?
В предложенном варианте использовался std::is_same_v.
источник

CD

Constantine Drozdov in pro.cxx
Побитый Кирпич
Как это лучше записать задача :)
Задача должна исходить из потребности путем делегирования, и я не представляю, что во вселенной может быть выражено при помощи шаблонного статического массива
источник

v

vient in pro.cxx
у меня есть несколько списков констант, разные для разных типов
источник

CD

Constantine Drozdov in pro.cxx
выглядит как функция, возвращающая массив по типу
источник

v

vient in pro.cxx
а оно соптимизируется до нулевой стоимости?
источник

АР

Андрей Руссков... in pro.cxx
Andrey Davydov
В предложенном варианте использовался std::is_same_v.
ну я же говорю, правила могут быть разными. Правила типа "размер больше 8" тоже потребуют type_traits
источник

PK

Pavel Kazakov in pro.cxx
vient
а оно соптимизируется до нулевой стоимости?
Нулевая стоимость (абстракции) -- это когда и "руками", и плюсами пишешь, и одинаковый код получается; это не отсутствие стоимости
источник

v

vient in pro.cxx
vient
а оно соптимизируется до нулевой стоимости?
ну наверное да, это же будет чистая функция...
с другой стороны, делать целую функцию ради значения
источник

SE

Stanislav Ershov in pro.cxx
Андрей Руссков
type_traits то зачем? И что, "если влазит в строку то не надо переносить"?
можно билтины __is_same/__is_same_as использовать да))
источник

PK

Pavel Kazakov in pro.cxx
Stanislav Ershov
можно билтины __is_same/__is_same_as использовать да))
В 2020 бы на хедере экономить, при том на таком широко используемом, ага) вообще это навелосипедить можно в три строки
источник

m

magras in pro.cxx
vient
а оно соптимизируется до нулевой стоимости?
Результат положить в constexpr и можно быть уверенным.
источник

АК

Александр Караев... in pro.cxx
Хочу перейти с виртуального интерфейса на статический. Если упрощенно, то вместо:

struct I { virtual void foo() { /* nothing */ } };
struct A : I { void foo() final { /* impl */ } };
struct B : I { /* no foo */ };


Иметь

struct A { void foo() { /* impl */ } };
struct B { /* no foo */ };


Я могу отличить A от B, проверив статически наличие void foo(), но есть нюанс - нет аналога final/override. То есть, если я ошибусь в сигнатуре функции или опечатаюсь в названии, компилятор меня не поправит. Есть способ решить эту проблему? Я думал в сторону каких-нибудь варнингов, которые будут реагировать на неиспользуемый метод. Компилятор - gcc.
источник

VS

Vlad Serebrennikov in pro.cxx
Александр Караев
Хочу перейти с виртуального интерфейса на статический. Если упрощенно, то вместо:

struct I { virtual void foo() { /* nothing */ } };
struct A : I { void foo() final { /* impl */ } };
struct B : I { /* no foo */ };


Иметь

struct A { void foo() { /* impl */ } };
struct B { /* no foo */ };


Я могу отличить A от B, проверив статически наличие void foo(), но есть нюанс - нет аналога final/override. То есть, если я ошибусь в сигнатуре функции или опечатаюсь в названии, компилятор меня не поправит. Есть способ решить эту проблему? Я думал в сторону каких-нибудь варнингов, которые будут реагировать на неиспользуемый метод. Компилятор - gcc.
аккуратно упомяну паттерн CRTP. не уверен, что он решит проблему, но можете в ту сторону посмотреть
источник

АК

Александр Караев... in pro.cxx
Vlad Serebrennikov
аккуратно упомяну паттерн CRTP. не уверен, что он решит проблему, но можете в ту сторону посмотреть
CRTP теоретически может помочь, если каждую "бывшую" виртуальную функцию выносить в отдельный базовый класс, делать чисто виртуальной в нём, тем самым форсируя необходимость оверрайда. Проблему решает, но очень многословно. Ещё бы вариантов

Хотя, в такой ситуации CRTP и не нужен.
источник