以下代码显示了课程A
,B
和C
。 A
是B
和C
的ctor参数。
宏X
有条件地创建A
或B
个实例。
#include <iostream>
class A
{
};
class B
{
public:
B( const A& a ) : a_( a ) { std::cout << __FUNCTION__ << std::endl; }
private:
const A& a_;
};
class C
{
public:
C( const A& a, const std::string& file, int line )
: b_( ( (std::cout << "@ " << file << ":" << line << std::endl), a ) )
{
std::cout << "After" << std::endl;
}
private:
B b_;
};
#undef DEBUG
#ifdef DEBUG
#define X( Z ) B b##Z( Z )
#else
#define X( Z ) C c##Z( Z, __FILE__, __LINE__ )
#endif
int main( int argc, char* argv[] )
{
A a;
B b( a );
C c( a, __FILE__, __LINE__ );
X( a );
return 0;
}
我被要求将B
重命名为SomethingElse
并创建一个B
宏,以便B b( a )
的所有现有实例变为SomethingElse
或{ {1}}。
我不认为这个问题可以得到满足,因为C
和SomethingElse
构造函数有不同的签名,所以我不能这样做:
C
是否有C预处理专家可以确认是否有办法满足要求?可以创建宏,以便#ifdef DEBUG
#define B SomethingElse
#else
#define B C
#endif
的所有现有实例都可以在编译时交换到B
或SomethingElse
的实例化吗?您可以假设C
的第二个和第三个参数为C
和__FILE__
。
答案 0 :(得分:4)
一旦你意识到C ++继承实现了一个IS-A关系,这是相当容易的。
您定义了一个新的类realB<const str* FILE, int LINE>
,其中IS-A(派生自)C
或SomethingElse
。您需要的唯一小技巧是帮助constexpr const char*
捕获__FILE__
,请参阅here。
现在realB<FILE, LINE>
有一个ctor只有一个参数A a
,但如果它继承自C
,它仍然可以将(a, FILE, LINE)
传递给C::C
< / p>
答案 1 :(得分:0)
我在手机上,所以这是未经测试的,但您可以尝试:
#if DEBUG
# define CREATEB(a) somethingelse(a)
#else
# define CREATEB(a) C( (a), __FILE__, __LINE__ )
#endif
这些应该在auto
或引用到基类声明的右侧工作。