Size: a a a

2020 August 07

CD

Constantine Drozdov in pro.cxx
ну function и variant слишком разные, чтобы использовать общий термин
источник

АК

Александр Караев... in pro.cxx
когда там уже завезут универсальный TE враппер, для которого просто описываешь требуемые операции и радуешься?
источник

АР

Андрей Руссков... in pro.cxx
нужен специально обученный абстрактным областям математики разработчик на функциональных языках который скажет какой термин будет правильным в данном случае
источник

АР

Андрей Руссков... in pro.cxx
variant это тип-сумма
источник

VK

Valentin Kornienko in pro.cxx
Александр Караев
когда там уже завезут универсальный TE враппер, для которого просто описываешь требуемые операции и радуешься?
void* :D
источник

АР

Андрей Руссков... in pro.cxx
union тоже
источник

m

magras in pro.cxx
Александр Караев
когда там уже завезут универсальный TE враппер, для которого просто описываешь требуемые операции и радуешься?
В бусте есть. =)
Кажется много где еще есть такое.
источник

VK

Valentin Kornienko in pro.cxx
magras
В бусте есть. =)
Кажется много где еще есть такое.
А как в бусте зовется?
источник

АК

Александр Караев... in pro.cxx
magras
В бусте есть. =)
Кажется много где еще есть такое.
я видел разные реализации, но все они чересчур многословны или неочевидны
источник

m

magras in pro.cxx
Valentin Kornienko
А как в бусте зовется?
type erasure =)
источник

m

magras in pro.cxx
Александр Караев
я видел разные реализации, но все они чересчур многословны или неочевидны
Бустовый type erasure я использовал чтобы получить any с какой-то одной дополнительной операцией. Кажется это было сравнение. Реализация была в виде одного typedef'а на несколько строк.
источник

m

magras in pro.cxx
Вот пример из доки:
any<
   mpl::vector<
       copy_constructible<>,
       typeid_<>,
       incrementable<>,
       ostreamable<>
   >
> x(10);
++x;
std::cout << x << std::endl; // prints 11
источник

АК

Александр Караев... in pro.cxx
magras
Вот пример из доки:
any<
   mpl::vector<
       copy_constructible<>,
       typeid_<>,
       incrementable<>,
       ostreamable<>
   >
> x(10);
++x;
std::cout << x << std::endl; // prints 11
ну это не то =)
а если мне нужно какое-то кастомное свойство? как его описывать?
источник

АР

Андрей Руссков... in pro.cxx
кажется кто-то хочет dynamic dispatch из раста )
источник

m

magras in pro.cxx
Александр Караев
ну это не то =)
а если мне нужно какое-то кастомное свойство? как его описывать?
Этого я не делал, но наверняка у них есть решение.
источник

m

magras in pro.cxx
Андрей Руссков
кажется кто-то хочет dynamic dispatch из раста )
Не совсем. Dynamic dispatch это почти обычные виртуальные функции из плюсов. Да с его помощью можно реализовать что-то вроде any в виде Box<dyn AnyTrait>. У раста здесь есть преимущство в том, что можно реализовать свой трейт для чужого типа или чужой трейт для своего типа. Но это не будет работать, если и тип и трейт чужие.
источник

АК

Александр Караев... in pro.cxx
мне понравилось решение отсюда:

описываем type-erasure интерфейс того, что хотим иметь в нашем any (здесь - метод void draw(std::ostream&) const)

struct any_drawable : te::poly<any_drawable> {
 using te::poly<any_drawable>::poly;

 // интерфейс нашего any (на тело можно не смотреть)
 void draw(std::ostream &out) const {
   te::call([](auto const &self, auto &out) { self.draw(out); }, *this, out);
 }
};

пишем любой класс, который удовлетворяет этому интерфейсу:
struct Circle { void draw(std::ostream& os) const { os << "circle"; } };

и всё:
any_drawable foo = Circle{};
foo.draw(std::cout);
источник

АК

Александр Караев... in pro.cxx
Андрей Руссков
кажется кто-то хочет dynamic dispatch из раста )
трейты раста лучше реализованы тут, я думаю - https://github.com/ldionne/dyno
источник

m

magras in pro.cxx
Александр Караев
мне понравилось решение отсюда:

описываем type-erasure интерфейс того, что хотим иметь в нашем any (здесь - метод void draw(std::ostream&) const)

struct any_drawable : te::poly<any_drawable> {
 using te::poly<any_drawable>::poly;

 // интерфейс нашего any (на тело можно не смотреть)
 void draw(std::ostream &out) const {
   te::call([](auto const &self, auto &out) { self.draw(out); }, *this, out);
 }
};

пишем любой класс, который удовлетворяет этому интерфейсу:
struct Circle { void draw(std::ostream& os) const { os << "circle"; } };

и всё:
any_drawable foo = Circle{};
foo.draw(std::cout);
Если верить документации, в бусте это записывается чуть короче, но с макросами (код не проверял):

BOOST_TYPE_ERASURE_MEMBER(draw)

using any_drawable = any<
   mpl::vector<
       copy_constructible<>,
       has_draw<void(std::ostream&)>
   >
>;

any_drawable foo(Circle{});
foo.draw();
источник

АК

Александр Караев... in pro.cxx
magras
Если верить документации, в бусте это записывается чуть короче, но с макросами (код не проверял):

BOOST_TYPE_ERASURE_MEMBER(draw)

using any_drawable = any<
   mpl::vector<
       copy_constructible<>,
       has_draw<void(std::ostream&)>
   >
>;

any_drawable foo(Circle{});
foo.draw();
выглядит неплохо.
а на строчке foo.draw() автокомплит не сойдёт с ума, если попытаться показать список членов объекта foo?
источник