首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >到C++中的周围类型的类型定义

到C++中的周围类型的类型定义
EN

Stack Overflow用户
提问于 2016-01-27 17:51:35
回答 3查看 721关注 0票数 17

有没有一种方法可以在类型声明中为声明的(周围的)类型本身构建一个typedef,而不声明类型的名称?

示例:

代码语言:javascript
复制
class X
{
  public:
    typedef <fill in magic here> MyType;
  //...
};

背景:乍一看,这似乎很愚蠢。我需要它,因为我使用宏来构建我的数据类的编译时反射。因此,在数据类的声明中插入了一个宏,它需要处理插入到其中的类型。到目前为止,我找到了适用于MSVC和g++的有效解决方案,它们都依赖于我认为是实现中的缺陷。因此,它们可能在较新的版本上不起作用。Clang不会“吃掉”这些解决方案中的任何一个。

我目前的MSVC解决方案定义了一个方法,然后只通过它的名称获取它的地址,并调用一个小帮助器来“返回”它的类的类型。(Clang和g++期望方法的全名,包括它的类名)。

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

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

如果什么都不起作用,我必须将类名传递给宏,但我会尽量避免这种情况,因为我已经有大量使用宏的代码。

编辑:添加一个关于反射如何工作的示例(这可能会阐明我需要什么):

代码语言:javascript
复制
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) )。但是我几乎无法想象像定义周围类型这样“简单”的任务没有解决方案……

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-16 03:32:26

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

票数 -3
EN

Stack Overflow用户

发布于 2016-02-03 07:42:56

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

代码语言:javascript
复制
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的类型

代码语言:javascript
复制
X::MyType::V

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

代码语言:javascript
复制
#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

这对你的目的来说足够好了吗?

票数 2
EN

Stack Overflow用户

发布于 2016-02-04 05:40:29

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

代码语言:javascript
复制
#define CLASS_WITH_MY_TYPE(ClassName) \ 
    class ClassName                   \
    {                                 \
       using MyType = ClassName;

然后使用像这样

代码语言:javascript
复制
CLASS_WITH_MY_TYPE(X)
public:
  struct Y
  {
    using T = MyType;
  };
};

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

标记为社区维基,因为@Chris提到了该链接,原始答案由@Bartek Banachewicz发布

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35033910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档