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

时间:2016-01-27 09:51:35

标签: c++ visual-c++ g++ clang++

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

示例:

class X
{
  public:
    typedef <fill in magic here> MyType;
  //...
};

背景: 这看起来很傻。我需要这个,因为我使用宏构建了数据类的编译时反射。 因此,在数据类的声明中插入了一个宏,需要处理它所插入的类型。 到目前为止,我找到了MSVC和g ++的工作解决方案,它们都依赖于我认为在实现中存在的缺陷。因此他们可能无法使用更新的版本。 Clang不会&#34;吃&#34;这些解决方案中的任何一个。

我目前针对MSVC的解决方案定义了一种方法,然后仅通过它的名称来获取它的地址,并调用一个小帮手,即#34;返回&#34;它的类型。 (Clang和g ++期望方法的全名,包括它的类名)。

我目前的g ++解决方案定义了一个返回类型为std::remove_reference(decltype(*this))的静态方法。 (Clang和MSVC在静态上下文中不允许this

我绝对更喜欢标准的一致性解决方案,但目前对于clang的特殊解决方案也是可以的。

如果没有任何作用,我必须通过课程#39;宏的名称,但我试图避免这种情况,因为我已经有足够的代码使用宏。

编辑:添加关于反射如何工作的示例(这可能会澄清我需要的内容):

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宏,其中参数接收基类。如上所述:可以给它上课#39;将name命名为第一个参数(在示例中生成CLASSHEAD(X, Y))。但是我几乎无法想象没有解决这样一个&#34;简单的&#34;任务为typedef&#39;周围的类型...

3 个答案:

答案 0 :(得分:2)

这并不完全符合您的规格,但我认为它非常接近:

class X
{
//Stuff...

//Use Macros to add:
struct MyType;

//Use class closing macro to insert variable between class-ending brace and semicolon      


} TYPE_VAR;
//Perhaps add random stuff to TYPE_VAR name to avoid collisions, like __FILE__
struct decltype(TYPE_VAR)::MyType
{
    typedef decltype(TYPE_VAR) V;
};

然后使用

访问X的类型
X::MyType::V

例如,简化的CLASSFOOT可能如下所示:

#define CLASSFOOT /*Your classfoot here*/ } TYPE_VAR; struct decltype(TYPE_VAR)::MyType {typedef decltype(TYPE_VAR) V;
//No }; at end on purpose- this will come from the class in which you placed CLASSFOOT

这对你的目的来说是否足够好?

答案 1 :(得分:0)

由于您已经在使用宏,因此可以使用此解决方案https://stackoverflow.com/a/21143997/2173029

CLASS_WITH_MY_TYPE(X)
public:
  struct Y
  {
    using T = MyType;
  };
};

static_assert(std::is_same<X, typename X::Y::T>::value, "");

然后使用

.ix

自从@Chris提到链接以来,标记为社区维基,原始答案由@Bartek Banachewicz发布

答案 2 :(得分:-3)

Nohting工作正常,因此使用宏中的类名称是唯一可行的解​​决方案