gpt4 book ai didi

C++ 编译型资源所有者断言

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:53:22 25 4
gpt4 key购买 nike

class Resource;

class Device
{
...
public:
Resource createResource();

bindResource(const Resource&);
};

int main()
{
Device dev;
Device oops;

auto res = dev.createResource();

dev.bindResource(res); // Okay; dev created this resource

oops.bindResource(res); // Error: oops did not create this resource
}

Program does not compile

这是否可以在没有运行时开销和类似语法的情况下完全在编译时完成?例如,设备是 Direct3D 渲染器的抽象;我们无法共享某些资源,如果我们尝试,应该会出现编译时错误。

最佳答案

有一个解决方法,它使用 __COUNTER__宏。虽然标准没有提供,但 MSVC 和 GCC 支持它。该宏与一个整数值相关,每次在翻译单元中使用该宏时该值都会递增。因此,实现如下:

// Device.h
#define DEVICE Device<__COUNTER__>

template<int N>
class Device
{
public:
class Resource{};
Resource createResource() { return Resource(); }
void bindResource(const Resource&) {}
};

如您所见,Resource类现在在 Device 中声明类(class)。 Device 的所有实例应使用 DEVICE 声明类宏。现在,devoops实例被实例化为不同类型的对象。 devDevice<0>oopsDevice<1> .并且分别res现在是Device<0>::Resource , 哎呀不能绑定(bind)它。

但是,这种方法有以下缺点(至少):
1) 将设备作为函数参数传递是一个问题。为了保证编译时检查,所有处理设备的函数也应该是模板。它可能会导致严重的代码膨胀。
2) 如果你声明了一个DEVICE类型的数组(例如DEVICE devices[10]),所有的设备都是相同的类型,这样就可以相互绑定(bind)资源。
3) __COUNTER__ 宏仅通过单个翻译单元提供唯一值。如果你声明 dev在一个翻译单元的开头和oops在第二个翻译单元的开头,它们的类型将相等,并且 oops将能够绑定(bind) dev的资源。
4) __COUNTER__ 不是标准提供的。

毕竟,我不建议您使用此解决方法,它可能仅用于教育目的:)

关于C++ 编译型资源所有者断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24326642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com