C++ 对象和它';在一个宏定义调用中调用类定义
我想写一个宏,在下面的用法中,它定义了一个全局对象C++ 对象和它';在一个宏定义调用中调用类定义,c++,macros,C++,Macros,我想写一个宏,在下面的用法中,它定义了一个全局对象foobar,该对象是在它下面定义的类 SOMEMACRO(foobar) { public: int a; }; 换言之,我希望上述内容具有与以下内容相同的效果: class SomeClassPossiblyWith_foobar_InItsName { public: int a; }; SomeClassPossiblyWith_foobar_InItsName foobar; 为对象精确地指定“foobar”名称(或者至
foobar
,该对象是在它下面定义的类
SOMEMACRO(foobar)
{
public:
int a;
};
换言之,我希望上述内容具有与以下内容相同的效果:
class SomeClassPossiblyWith_foobar_InItsName
{
public:
int a;
};
SomeClassPossiblyWith_foobar_InItsName foobar;
为对象精确地指定“foobar”名称(或者至少以这种方式调用对适当对象的引用)非常重要。只要允许多次使用宏,类的名称就无关紧要
这相当困难,因为类通常应该在使用之前定义,但可能存在一些棘手的(可能涉及模板)实现方法?使用预处理器串联运算符
。
非常简单
比如:
#define SOMEMACRO(name) \
SomeClassPossiblyWith_##name##_InItsName name; \
class SomeClassPossiblyWith_##name##_InItsName
同时,我已经找到了一个解决方案,可以进行引用,并用适当的对象初始化它,它以某种方式回答了这个问题。我不确定这是标准投诉(符合gcc 4.6)
模板
延迟生成对象(&U)
{
静态T-obj;
返回obj;
}
#定义DOIT(_name)\
###u name的类类型\
TypeFor###(u name&_name=delayed_make_object())\
###u名称的类类型
多伊特(富)
{
公众:
国际广播公司;
};
多伊特(酒吧)
{
公众:
国际cba;
};
int main()
{
foo.abc=bar.cba;//有效!
}
您可以这样做:
#define SING(classname, body) class SING_##classname \
body \
; SING_##classname classname;
SING (foobar, {
public:
int a;
}
);
然后,这样使用它:
#define SING(classname, body) class SING_##classname \
body \
; SING_##classname classname;
SING (foobar, {
public:
int a;
}
);
编辑:为代码添加了更多解释 具有模板的解决方案如下所示: 我已经为类创建了一个模板,这些类在创建时应该有一个具有全局访问权限的实例。我想这就是你想要的。(我将其命名为Singleton reffering,以名称引用设计模式) .h:
然而,这个解决方案的问题是,单例模板将只适用于具有空构造函数的类。但是你的例子也是如此,所以我认为这就是你想要的。我不知道你为什么要这样做,但类似的是在宏中有类:不完全是这个,但也是有趣的想法。但是你为什么要这样做呢?宏只是扩展成文本,它不能神奇地在其他地方插入更多文本。当然,这是最简单的部分。问题是,在这个类的对象被完全定义之前,我无法实例化它。我认为它不会编译。在声明类之前正在创建一个对象实例。@Deidara senpai,如果您同意将指针作为对象,这将起作用。我认为移动一个括号比移动一个指针损失小。是的,@chris在对我的问题的评论中建议了这一点。但是它也有一些缺点(不能在正文中使用逗号,正文中的编译器错误会被奇怪地报告)。
// C++ source for template Singleton
template<typename T>
Singleton<T>* Singleton<T>::instance = NULL;
template<typename T>
Singleton<T>::Singleton()
: T()
{}
template<typename T>
Singleton<T>* Singleton<T>::getInstance()
{
if (instance == NULL)
{
instance = new Singleton<T>();
}
return instance;
}
// Definition of class foobar
class foobar_impl {
public:
int a;
};
typedef Singleton<foobar_impl> Foobar;
int main(int argc, char** argv)
{
Foobar *pf = Foobar::getInstance();
return 0;
}