C ++ 11:使用右值引用实现装饰器的最佳方法

时间:2012-03-07 23:29:36

标签: c++ c++11 decorator rvalue-reference

我正在开发一个新版本的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;
};

rvalue-reference的第二个传递参数:

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;
};

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

我也可以制作装饰方法的参数和右值引用,但是因为我想遵守接口(因此显式覆盖),我无法改变它。

1 个答案:

答案 0 :(得分:1)

你似乎对移动的真正含义有误解:

移动只是一个更好的副本。

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