在C++中键入def到周围类型

17 c++ g++ visual-c++ clang++

有没有办法为typedef声明的(周围)类型本身构建一个类型声明,而不说明类型的名称?

例:

class X
{
  public:
    typedef <fill in magic here> MyType;
  //...
};
Run Code Online (Sandbox Code Playgroud)

背景:这看起来很傻.我需要这个,因为我使用宏构建了数据类的编译时反射.因此,在数据类的声明中插入了一个宏,需要处理它所插入的类型.到目前为止,我找到了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
};
Run Code Online (Sandbox Code Playgroud)

CLASSHEAD是应该定义的宏typedef.它是VAR_ARGS宏,其中参数接收基类.如上所述:可以给它类名称作为它的第一个参数(CLASSHEAD(X, Y)在示例中得到).但我几乎无法想象没有解决这种"简单"任务的方法,如对周围类型的类型...

mmm*_*mmm -3

Nohting 有效,因此在宏中使用类名称是唯一有效的解决方案