История изменений
Исправление CatsCantFly, (текущая версия) :
Вся эта хрень не нужна вообще. Какие то базовые классы-помойки, общие ненужные свойства, методы кастов.
Когда можно забить на ООП-костыли и делать
class Printer
{
public:
void print() const;
};
class Scanner
{
public:
void scan() const;
};
class Foo
{
public:
void print() const;
void scan() const;
};
using Object = std::variant<Printer, Scanner, Foo>;
// используем гетерогенную коллекцию таких объектов
void bar(const std::vector<Object>& objects)
{
auto call = template<class T>[](T&& o)
{
if constexpr(requires { std::declval<T>.print(); })
{
o.print();
}
if constexpr(requires { std::declval<T>.scan(); })
{
o.scan();
}
}
for(auto& obj : objects)
std::visit(call, obj);
}
Исправление CatsCantFly, :
Вся эта хрень не нужна вообще. Какие то базовые классы-помойки, общие ненужные свойства, методы кастов.
Когда можно забить на ООП-костыли и делать
class Printer
{
public:
void print();
};
class Scanner
{
public:
void scan();
};
class Foo
{
public:
void print();
void scan();
};
using Object = std::variant<Printer, Scanner, Foo>;
// используем гетерогенную коллекцию таких объектов
void bar(const std::vector<Object>& objects)
{
auto call = template<class T>[](T&& o)
{
if constexpr(requires { std::declval<T>.print(); })
{
o.print();
}
if constexpr(requires { std::declval<T>.scan(); })
{
o.scan();
}
}
for(auto& obj : objects)
std::visit(call, obj);
}
Исправление CatsCantFly, :
Вся эта хрень не нужна вообще. Какие то базовые классы-помойки, общие ненужные свойства, методы кастов.
Когда можно забить на ООП-костыли и делать
class Printer
{
public:
void print();
};
class Scanner
{
public:
void scan();
};
class Foo
{
public:
void print();
void scan();
};
using Object = std::variant<Printer, Scanner, Foo>;
// используем гетерогенную коллекцию таких объектов
void bar(const std::vector<Object>& objects)
{
auto call = template<class T>[](T&& o)
{
if constexpr(requires { std::declval<T>.print(); })
{
o.print();
}
if constexpr(requires { std::declval<T>.scan(); })
{
o.scan();
}
}
for(auto& obj : objects)
std::visit(call, obj);
}
Исходная версия CatsCantFly, :
Вся эта хрень не нужна вообще. Какие то базовые классы-помойки, общие ненужные свойства, методы кастов.
Когда можно забить на ООП-костыли и делать
class Printer
{
public:
void print();
};
class Scanner
{
public:
void scan();
};
class Foo
{
public:
void print();
void scan();
};
using Object = std::variant<Printer, Scanner, Foo>;
void bar(const std::vector<Object>& objects)
{
auto call = template<class T>[](T&& o)
{
if constexpr(requires { std::declval<T>.print(); })
{
o.print();
}
if constexpr(requires { std::declval<T>.scan(); })
{
o.scan();
}
}
for(auto& obj : objects)
std::visit(call, obj);
}