基于概念的多态性

Concept Based Polymorphism

本文关键字:多态性 于概念      更新时间:2023-10-16

我一直在阅读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;
}

提前谢谢。

布莱尔

几点:

  • 我认为没有任何充分的理由将drawable_conceptdrawable_model放入graphics_surface - 您只是阻止重用在其他容器类型中可能有用的东西......

  • 您有一些const问题

    • draw可能应该const(函数定义后面不应该跟分号;-)

    • drawable_model(T& item)应通过const参考item

    • push_back(T& drawable)应通过const参考drawable

  • 您应该使用 make_shared 以确保异常安全

  • "工厂"功能可以说最好分离成一个单独的功能,而不是埋在push_back

你在这里的方法更多的是关于类型擦除,而不是关于基于概念的编程。它是boost::any使用的想法的扩展。概念是对类或函数模板所需类型的一组约束。STL具有ForwardIterator和InputIterator等概念。例如,对于传递给某些 std 算法的参数,这些约束应该是正确的。