gpt4 book ai didi

c++ - 多重继承的可变参数宏

转载 作者:太空宇宙 更新时间:2023-11-04 12:05:13 25 4
gpt4 key购买 nike

我已经写了一个宏,可以添加到一个类定义周围,这将有效地最终化它(防止子类化)。这种完成方法是一种相当常见的技术,在 C++ FAQ 中有说明。 :

#define FINALIZE(NAME,...) \
NAME##Finalizer {\
private:\
friend class NAME;\
inline NAME##Finalizer(void) {}\
};\
class NAME : public virtual NAME##Finalizer, __VA_ARGS__

例如:

class FINALIZE(Fred) {};
//The above line evaluates to:
// class FredFinalizer {
// private:
// friend class Fred;
// inline FredFinalizer(void) {}
// };
// class Fred : public virtual FredFinalizer, {};

class George {};
class FINALIZE(Fred2, public George) {};
//The above line evaluates to:
// class Fred2Finalizer {
// private:
// friend class Fred2;
// inline Fred2Finalizer(void) {}
// };
// class Fred2 : public virtual Fred2Finalizer, public George {};

class Velma : public Fred { Velma(void) {} /*Note compile error*/ };
class Velma2 : public Fred2 { Velma2(void) {} /*Note compile error*/ };

这很好用。问题是我现在想要一种“禁用”宏的方法。即:

class FINALIZE(Fred) {};
//The above line evaluates to:
// class Fred {};

class George {};
class FINALIZE(Fred2, public George) {};
//The above line evaluates to:
// class Fred2 : public George {};

问题是 class Fred2 : public George {}; 与没有继承的情况 (class Fred {};) 冲突:在第一种情况下, 必须始终有一个冒号,在第二种情况下,不能有。请注意,启用宏时这不是问题,因为类总是继承至少 NAME##Finalizer 类。

如何编写执行此操作的宏?

最佳答案

我建议制作两个宏,一个用于准备终结器,一个用于使用:

#define PREP_FINALIZE(NAME) \
class NAME##Finalizer {\
private:\
friend class NAME;\
inline NAME##Finalizer() {}\
}

#define FINALIZE(NAME) virtual NAME##Finalizer

所以在你的例子中:

PREP_FINALIZE(Fred);
class Fred : FINALIZE(Fred) {};

class George {};
PREP_FINALIZE(Fred2);
class Fred2 : FINALIZE(Fred2), public George {};

但更重要的是你忘记了将复制构造函数设为私有(private)。没有它,您的方式很容易作弊:

// cheating :D
class Velma : public Fred, FINALIZE(Fred) {
Velma() : FredFinalizer(*(FredFinalizer*)0) {} /*Who said this is compiler error */
};

将终结器的复制构造函数设为私有(private)。或者使用我的 answer非常相似的问题。

对于 C++11 只需使用 final ;)

关于c++ - 多重继承的可变参数宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12440280/

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