C++11:用右值引用实现decorator的最佳方法

C++11: Best way to implement decorator with rvalue references

本文关键字:decorator 最佳 方法 实现 引用 C++11      更新时间:2023-10-16

我正在开发一个新版本的CLI实用程序,该实用程序生成访问者,并希望添加装饰功能。

为了实现这一点,我想知道在C++中以及最终在C++11中实现装饰器的最佳方式是什么。

例如,有这样一个接口:

class IHello
{
public:
    virtual void hello(std::string name) = 0;
};

我有两种可能性,要么再次复制参数name将其传递给对象,要么创建一个具有std::move语义的右值引用。

因此,我有两个不同的装饰师。按副本传递的第一个参数:

class HelloCopy : public IHello
{
public:
    HelloCopy(IHello& instance)
        :instance (instance)
    {
    }
    virtual void hello(std::string name) override
    {
        this->instance.hello(name);
    }
private:
    IHello& instance;
};

右值引用传递的第二个参数:

class HelloRValue : public IHello
{
public:
    HelloRValue(IHello& instance)
        :instance (instance)
    {
    }
    virtual void hello(std::string name) override
    {
        this->instance.hello(std::move(name));
    }
private:
    IHello& instance;
};

我的问题是:实现装饰器的最佳(最有效)方式是什么?

我也可以使装饰方法的参数和右值引用,但由于我想遵守接口(因此显式重写),我无法更改它。

您似乎对移动的真正含义有一个误解:

移动只是一个更好的复制

因此,移动永远不会比副本更糟糕,如果类型包含外部数据,则移动总是更快(假设移动构造函数是健全的)。