有没有一种方法可以typedef
在声明的(环绕的)类型本身内部构建类型声明,而无需说明类型名称?
例子:
class X
{
public:
typedef <fill in magic here> MyType;
//...
};
背景:乍看之下,这似乎很愚蠢。我需要这样做,因为我使用宏构建了数据类的编译时反射。因此,在数据类的声明中插入了一个宏,该宏需要处理它所插入的类型。到目前为止,我发现了适用于MSVC和g ++的可行解决方案,它们都依赖于我认为的实现缺陷。因此,它们可能不适用于较新的版本。Clang不会“吃”这两种解决方案。
我当前的MSVC解决方案定义了一个方法,然后仅通过其名称获取其地址,然后调用一个小助手来“返回”其类的类型。(Clang和g ++期望该方法的全名,包括其类名)。
我当前的g ++解决方案定义了带有返回类型的静态方法std::remove_reference(decltype(*this))
。(Clang和MSVC不允许this
在静态上下文中使用)。
我绝对希望使用标准的标准解决方案,但目前对clang的特殊解决方案也可以。
如果没有任何效果,我必须将类的名称传递给宏,但是我尽量避免这样做,因为我已经有很多使用宏的代码了。
编辑:添加有关反射如何工作的示例(这可能澄清了我的需要):
class X : public Y
{
public:
//.. constructor and such stuff...
int a;
double b;
std::string c;
CLASSHEAD(Y)
FIELD(a)
FIELD(b)
FIELD(c)
CLASSFOOT
};
CLASSHEAD
是应该定义的宏typedef
。这是一个VAR_ARGS宏,其中参数接收基类。如前所述:可以给它类的名称作为第一个参数(CLASSHEAD(X, Y)
在示例中产生)。但是我几乎无法想象,对于定义周围类型的“简单”任务没有解决方案……
Nohting有效,因此在宏中使用类Name是唯一可行的解决方案
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句