我有以下宏,可以有条件地生成和初始化类的成员:
#ifdef LIFETIME_TRACKING
#define DEFINE_TRACKER_MEMBER() mutable ::LifetimeTracker m_tracker
#define INITIALIZE_TRACKER_MEMBER(x) m_tracker(x)
#else
#define DEFINE_TRACKER_MEMBER() using dummy = void
#define INITIALIZE_TRACKER_MEMBER(x) /* ??? */
#endif
它们的用途如下:
struct Example
{
int data;
Dependency dep;
DEFINE_TRACKER_MEMBER();
Example() : data(42), INITIALIZE_TRACKER_MEMBER(dep) { }
};
当定义
LIFETIME_TRACKING
时,一切都很好。当未定义时,我无法找到一种方法使构造函数初始值设定项列表编译 , INITIALIZE_TRACKER_MEMBER(dep)
语法,而无需人为地增加类的大小或使语法丑陋且对 clang-format 不友好(例如,在内部包含逗号)宏,如 INITIALIZE_TRACKER_MEMBER(, dep)
)。
我想出的最好办法是让
DEFINE_TRACKER_MEMBER
创建一个虚拟的空结构成员:
#define DEFINE_TRACKER_MEMBER() struct { } m_tracker
#define INITIALIZE_TRACKER_MEMBER m_tracker{}
然而,这会增加父类的大小。
有什么方法可以保留所需的语法而不导致类大小增加?
只需将逗号移到宏本身中怎么样?
#ifdef LIFETIME_TRACKING
#define DEFINE_TRACKER_MEMBER() mutable ::LifetimeTracker m_tracker;
#define INITIALIZE_TRACKER_MEMBER(x) ,m_tracker(x)
#else
#define DEFINE_TRACKER_MEMBER()
#define INITIALIZE_TRACKER_MEMBER(x)
#endif
struct Example
{
int data;
Dependency dep;
DEFINE_TRACKER_MEMBER()
Example() : data(42) INITIALIZE_TRACKER_MEMBER(dep) { }
};