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
这可以在编译时完全完成,没有运行时开销和类似的语法吗? 例如,device是Direct3D渲染器的抽象;我们不能共享一些资源,如果我们尝试,应该是编译时错误。
答案 0 :(得分:0)
有一种解决方法,它使用__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
类中声明。应使用Device
宏声明DEVICE
类的所有实例。现在,dev
和oops
实例被实例化为不同类型的对象。 dev
为Device<0>
,oops
为Device<1>
。并且,res
现在分别为Device<0>::Resource
,而oops无法绑定它。
dev
而在第二个翻译单元的开头声明oops
,则其类型将相同,oops
将能够绑定{{ 1}}的资源
4)标准不提供 __ COUNTER __ 。
毕竟,我不建议您使用此解决方法,它可能仅用于教育目的:)