我有一个C ++包装类,它将一些硬件提取封装为:
class DeviceWrapper
{
private:
PhysicalDevice mDevice;
};
有各种类访问设备,并且大多数类接受底层设备作为它们的第一个参数,如下所示:
void someFunc(PhysicalDevice & device);
所以我目前在我的包装类中有以下getter方法:
PhysicalDevice & DeviceWrapper::getPhysicalDevice()
{
return mDevice;
}
我这样使用它:someFunc(myWrapper.getPhysicalDevice());
然而,这看起来有点麻烦。有没有办法定义某种类型的运算符,它返回对此设备的引用,然后我基本上可以使用对包装类的引用,只要需要引用PhyscialDevice
。
答案 0 :(得分:3)
有两种常见的表达方式:
class DeviceWrapper
{
operator PhysicalDevice&() { return mDevice; }
private:
PhysicalDevice mDevice;
};
class DeviceWrapper
{
auto someFunc() { return ::somefunc(mDevice); }
private:
PhysicalDevice mDevice;
};
答案 1 :(得分:2)
是的,完全正确!
class DeviceWrapper
{
// ...
public:
operator PhysicalDevice &() {
return mDevice;
}
};
您已完成:DeviceWrapper
现在可以隐式转换为对其PhysicalDevice
的引用,例如在期望PhysicalDevice &
的函数调用中。
答案 2 :(得分:1)
如果您完全控制API,我会建议强制转换操作符,并建议阻止对底层设备对象的任何访问。
为什么?因为API应该易于使用,但难以滥用。如果允许用户直接和通过代理访问底层对象,则可能导致运行时状态不一致。
而是使用您的代理包装所有API方法,从而管理状态并使其保持一致:
class DeviceWrapper
{
public:
void someFunc1(PhysicalDevice & device) { ::someFunc1(mDevice); }
void someFunc2(PhysicalDevice & device) { ::someFunc2(mDevice); }
private:
PhysicalDevice mDevice;
};