Size: a a a

2020 July 07

PK

Pavel Kazakov in pro.cxx
по ошибке находится вот такой пост на SO https://stackoverflow.com/questions/16493652, там немного другой пример, но есть некие рассуждения на эту тему
источник

A

Alex in pro.cxx
Pavel Kazakov
по ошибке находится вот такой пост на SO https://stackoverflow.com/questions/16493652, там немного другой пример, но есть некие рассуждения на эту тему
Спасибо, понятно. Но обидно! На С++ можно написать что угодно, но как же сложно иногда к этому чему угодно сделать удобный интерфейс...
источник

PK

Pavel Kazakov in pro.cxx
ну тут, выходит, класс надо делить на две сущности, чтобы задумка работала
источник

A

Alex in pro.cxx
Да. А это корявый интерфейс.
источник

A

Alex in pro.cxx
Хм, может, пронаследовать второй класс от первого
источник

N

Neargye in pro.cxx
Alex
Упростил пример: https://godbolt.org/z/AMyXiwП

Повторюсь, что я уже проверил - если разделить функцию и объект на два разных класса, то работает. Просто я не пойму логику, по которой метод считается ещё не определенным. Кстати, так фигурные скобки работают, а в определении элемента std::array нет (в исходном примере), странно.
Можно вместо отдельной функции, заменить на вызов лямбды
https://godbolt.org/z/zq5YCW
источник

A

Alex in pro.cxx
не вариант, тогда это число "1" нужно писать в двух местах, а весь смысл в том, чтобы было одно
источник

PK

Pavel Kazakov in pro.cxx
вложенный класс не работает, черт) хотел сделать RegistryDetails::one(), но так низя тоже
источник

N

Neargye in pro.cxx
Alex
не вариант, тогда это число "1" нужно писать в двух местах, а весь смысл в том, чтобы было одно
я скинул пример, там один раз написано)
источник

A

Alex in pro.cxx
А вот наследование решает проблему - инжектит все методы из первого класса во второй
источник

A

Alex in pro.cxx
Neargye
я скинул пример, там один раз написано)
Этот пример не объявляет метод one(), который тоже нужен)
источник

O

Ofee in pro.cxx
Alex
Этот пример не объявляет метод one(), который тоже нужен)
static constexpr auto one = [] () {return A{1};};
https://godbolt.org/z/wxDr9v
источник

N

Neargye in pro.cxx
Alex
Этот пример не объявляет метод one(), который тоже нужен)
ну тогда функтор
https://godbolt.org/z/OeV3GL
источник

N

Neargye in pro.cxx
Ofee
static constexpr auto one = [] () {return A{1};};
https://godbolt.org/z/wxDr9v
ээх, опередил
источник

A

Alex in pro.cxx
Вот это рабочий вариант, спасибо за идею.
Глупость какая-то, constexpr функцию звать нельзя, а объект использовать можно. Похоже на баг стандарта.
источник

PK

Pavel Kazakov in pro.cxx
Ofee
static constexpr auto one = [] () {return A{1};};
https://godbolt.org/z/wxDr9v
ну так тоже самое же: есть два класса, сначала объявлен первый, а потом он используется во втором https://cppinsights.io/s/70359fd1
источник

PK

Pavel Kazakov in pro.cxx
хотя вот так работает:
struct Registry {
   static constexpr auto one = [] () {return 3;};
   static constexpr auto m_one = std::pair<const char*, decltype(one())>{"one",  one()};
};

int main() {
  return Registry::m_one.second;
}
:) уже ничего не хочу понимать, пойду дальше работать
источник

N

Neargye in pro.cxx
Pavel Kazakov
ну так тоже самое же: есть два класса, сначала объявлен первый, а потом он используется во втором https://cppinsights.io/s/70359fd1
Да, два класса

Просто интерфейс попроще) без вынужденого наследования и тд тп
источник

O

Ofee in pro.cxx
Pavel Kazakov
ну так тоже самое же: есть два класса, сначала объявлен первый, а потом он используется во втором https://cppinsights.io/s/70359fd1
Я полагаю, что это, всё же, это лишь наглядная интерпретация реализации, но не гарантия именно такого поведения.

Насколько я понимаю, в теории эта лямбда вовсе не обязана находиться в теле класса. А с точки зрения реализации, скорее всего, компилятор, даже не делает никаких определений лямбды в классе, он оперирует этим как-то более высокоуровнево
источник

N

Neargye in pro.cxx
Ofee
Я полагаю, что это, всё же, это лишь наглядная интерпретация реализации, но не гарантия именно такого поведения.

Насколько я понимаю, в теории эта лямбда вовсе не обязана находиться в теле класса. А с точки зрения реализации, скорее всего, компилятор, даже не делает никаких определений лямбды в классе, он оперирует этим как-то более высокоуровнево
ну по стандарту лямбды - классы функторы
источник