C++ 我可以使用预处理器将一个类型声明替换为另一个类型声明吗?

C++ 我可以使用预处理器将一个类型声明替换为另一个类型声明吗?,c++,macros,C++,Macros,以下代码显示类别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
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;
}

有没有C预处理器专家可以确认是否有一种方法可以满足这个问题?是否可以创建宏,以便在编译时将
B
的所有现有实例化替换为
SomethingElse
C
的实例化?您可以假设
C
的第二个和第三个参数将是
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

#if DEBUG
#  define CREATEB(a) somethingelse(a)
#else
#  define CREATEB(a) C( (a), __FILE__, __LINE__ )
#endif

这些应该在
自动
或基类声明引用的右侧起作用。

我在手机上,因此这未经测试,但您可以尝试:

#if DEBUG
#  define CREATEB(a) somethingelse(a)
#else
#  define CREATEB(a) C( (a), __FILE__, __LINE__ )
#endif

这些应该在自动< /COD>或引用基类声明的右边。

< P>这是相当容易的,一旦你意识到C++继承实现了IS-A关系。

您定义了一个新类
realB
,它是-a(派生自
C
SomethingElse
)。您需要的唯一小技巧是一个helper
constexpr const char*
来捕获
\uuuu文件
,请参阅


<>现在代码<> Realb只有一个参数cTor,代码>a/<代码>,但是如果继承了<代码> c>代码>,它仍然可以通过<代码>(a,文件,行)<代码> > <代码>:/c> > /p> < p>这是相当容易的,一旦你意识到C++继承实现了IS-A关系。 您定义了一个新类
realB
,它是-a(派生自
C
SomethingElse
)。您需要的唯一小技巧是一个helper
constexpr const char*
来捕获
\uuuu文件
,请参阅


现在,
realB
有一个只接受一个参数的ctor,
a
,但是如果它从
C
继承,它仍然可以将
(a,文件,行)
传递到
C::C

,真是一团糟,如果我是你,我会另找一份工作。你能举一个例子,说明对
B
收缩器的调用变成
SomethingElse
,而
C
应该被@davisor替换吗?如果
DEBUG
定义了,那么
B(a)
变成
SomethingElse\u a(a)
。如果
DEBUG
未定义,则
bb(a)
变为
cca(a,\uuuuuu文件,\uuuu行)
。就像我说的:我不认为这是可能的,但我愿意接受建议。@StoneThrow我认为这是针对你的工作场所实践的,是出于诚意。@StoneThrow我清楚地理解你是被迫做这些废话的,没有意识到我的评论模棱两可(英语不是我的第一语言,抱歉误解)真是一团糟,如果我是你,我会另找一份工作。你能举一个例子,说明对
B
收缩器的调用变成
SomethingElse
,而
C
应该被@davisor替换吗?如果
DEBUG
定义了,那么
B(a)
变成
SomethingElse\u a(a)
。如果
DEBUG
未定义,则
bb(a)
变为
cca(a,\uuuuuu文件,\uuuu行)
。就像我说的:我不认为这是可能的,但我愿意接受建议。@StoneThrow我认为这是针对你的工作场所实践的,并且是出于诚意。@StoneThrow我清楚地理解你是被迫这样做的,没有意识到我的评论模棱两可(英语不是我的第一语言,很抱歉误解)这是一个非常有趣的解决方案。我使用“
template
”样式的模板化(与“
template
”相反),所以当它变得有用时,很少会想到它。根据你的回答,我有一个基本的概念证明,我想我可以把它运用到实际情况中去。非常感谢。这是一个聪明的角度来处理这个问题。这是一个非常有趣的解决方案。我使用“
template
”样式的模板化(与“
template
”相反),所以当它变得有用时,很少会想到它。根据你的回答,我有一个基本的概念证明,我想我可以把它运用到实际情况中去。非常感谢。这是一个聪明的角度来处理这个问题。