Концептуальный полиморфизм

Я читал о концептуальном наследовании в C ++. Я приложил пример кода для всех. Я в основном спрашиваю, является ли это правильной реализацией концепции этого? Я новичок в этом, поэтому я просто записываю то, что у меня на уме. Любые комментарии / критические замечания приветствуются.

#include "stdafx.h"#include <memory>
#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;

struct Point{
int x;
int y;
};

class graphics_surface{

class drawable_concept{
public:
virtual void draw(Point const& coordinate) {};
virtual ~drawable_concept() {};
};

template<class T>
class drawable_model : public drawable_concept{
public:
drawable_model(T& item) : item_(item){}
void draw(Point const& coordinate){
item_.draw(coordinate);
}
~drawable_model(){}
private:
T item_;
};

public:

template<class T>
void push_back(T& drawable){
v_.push_back(shared_ptr<drawable_concept>( new drawable_model<T>(drawable)));
}

void draw(Point const& coordinate) {
for_each(v_.begin(), v_.end(), [&](shared_ptr<drawable_concept>& concept){
concept->draw(coordinate);
});
}

private:
vector<shared_ptr<drawable_concept>> v_;
};

struct triangle{
void draw(Point const& p){
cout << "Triangle: " << p.x << "," << p.y << endl;
}
};

struct square{
void draw(Point const& p){
cout << "Sqaure: " << p.x << "," << p.y << endl;
}
};int _tmain(int argc, _TCHAR* argv[])
{

Point p;
p.x = 1;
p.y = 2;

graphics_surface surface;
surface.push_back(triangle());

surface.draw(p);

return 0;
}

Заранее спасибо.

блэр

7

Решение

Несколько моментов:

  • Я не вижу веских причин ставить drawable_concept или же drawable_model внутри graphics_surface — вы просто предотвращаете повторное использование чего-то, что потенциально полезно в других типах контейнеров …

  • у тебя есть немного const проблемы

    • draw должно быть const (и определения функций не должны сопровождаться точкой с запятой 😉

    • drawable_model(T& item) должен взять item от const ссылка

    • push_back(T& drawable) должен взять drawable от const ссылка

  • ты должен использовать make_shared для исключительной безопасности

  • функциональность «фабрики», возможно, была бы лучше разделена на отдельную функцию, чем похоронена внутри push_back

2

Другие решения

Ваш подход здесь больше касается стирания типов, чем концептуального программирования. Это расширение идеи, используемой boost :: any. Понятия — это набор ограничений на тип, требуемый шаблоном класса или функции. STL имеет такие понятия, как ForwardIterator и InputIterator. Это ограничения, которые, как ожидается, будут истинными для параметров, передаваемых в некоторые стандартные алгоритмы, например.

1

Ваш triangle а также square классы должны наследовать от graphics_surface::drawable_concept, Прочитать о таблицы виртуальных методов.

Смотрите также википейдж на Концепции в C ++.

-3
По вопросам рекламы [email protected]