有条件地在构造函数初始化列表宏中吞下逗号

问题描述 投票:0回答:1

我有以下宏,可以有条件地生成和初始化类的成员:

#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{}

然而,这会增加父类的大小。

有什么方法可以保留所需的语法而不导致类大小增加?

c++ macros c++17 c-preprocessor
1个回答
0
投票

只需将逗号移到宏本身中怎么样?

#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) { }
};
© www.soinside.com 2019 - 2024. All rights reserved.