LINUX.ORG.RU

История изменений

Исправление 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);

}