C++11:用右值引用实现decorator的最佳方法
C++11: Best way to implement decorator with rvalue references
我正在开发一个新版本的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;
};
我的问题是:实现装饰器的最佳(最有效)方式是什么?
我也可以使装饰方法的参数和右值引用,但由于我想遵守接口(因此显式重写),我无法更改它。
您似乎对移动的真正含义有一个误解:
移动只是一个更好的复制
因此,移动永远不会比副本更糟糕,如果类型包含外部数据,则移动总是更快(假设移动构造函数是健全的)。
相关文章:
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 在c代码之间共享数据的最佳方式
- 使用std::source_location报告错误的最佳实践
- 派生类销毁的最佳实践是什么
- 将寄存器设计成可由C和C++访问的外设的最佳实践
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 在C++中向零方向近似的最佳方法
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 检测win32服务创建和删除的最佳方法
- 在reactor中存储eventHandlers的最佳方式是什么
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 在AVX通道中混洗的最佳方式
- 程序顶部的声明与定义(最佳实践)
- C++11:用右值引用实现decorator的最佳方法