我正在开发一个新版本的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;
};
我的问题是: 实现装饰器的最佳(最有效)方法是什么?
我也可以制作装饰方法的参数和右值引用,但是因为我想遵守接口(因此显式覆盖),我无法改变它。
答案 0 :(得分:1)
你似乎对移动的真正含义有误解:
移动只是一个更好的副本。
因此,移动永远不会比副本更糟糕,如果类型包含外部数据,它总是更快(假设一个理智的移动构造函数)。