【问题标题】:Macro to define javascript constructor keyword定义javascript构造函数关键字的宏
【发布时间】:2020-11-16 17:49:55
【问题描述】:

我有很多这样的课程:

struct A_Insert
{
    Data &d;
    A_Insert(d) : d(d){}

    // ...
}

struct A_Query
{
    Data &d;
    A_Query(d) : d(d){}

    // ...
}

struct B_Insert
{
    Data &d;
    B_Insert(d) : d(d){}

    // ...
}

struct B_Query
{
    Data &d;
    B_Query(d) : d(d){}

    // ...
}

我能想到的最好的办法就是定义一个这样的宏:

#define Data_Query(name, body) struct name{Data &d; name(Data &d) : d(d) {} body}

但这会导致代码有些难看,因为我必须使用括号来定义我的结构,而我的 IDE 不能很好地处理它。

Data_Query(A_Insert, 
    int bind_params(stmt &stmt){}
    ...
)

我想要一个宏,它可以让我获取构造函数的包含类型的名称,这样我就可以编写如下代码:

#define constructor CONTAINING_TYPE
#define Data_Construct Data &d; constructor (Data &d) : d(d) {}

结构 A_Insert { 数据构造 // ... }

这样我的 IDE 可以将其视为普通的 struct 声明。任何建议将不胜感激。

【问题讨论】:

  • 宏的本质是它们会导致一些丑陋的代码。不清楚为什么要首先使用宏。
  • @idclev463035818 有时为每个新构造函数输入类的名称可能很乏味。我想如果有类似 javascript 构造函数关键字的东西,它定义了一个构造函数,同时使其易于复制和粘贴并保持代码的可读性。我会将其添加到我的问题中。
  • 我看不出有什么原因。如果您使用的是中规中矩的 IDE,它肯定支持模板和自动完成。
  • @bipll 是真的,但我敢说有宏的代码往往比没有宏的代码更丑
  • 不,这在 C++ 中是不可能的。当然,使用宏几乎一切皆有可能,但在我工作的地方,只有一次才有可能。

标签: c++ c++11 constructor macros


【解决方案1】:

继承:

struct DataReference
{
    Data &d;
    
    DataReference(Data& d) : d(d) {}
};

struct A_Insert : DataReference
{
    using DataReference::DataReference;

    ...
};

【讨论】:

  • using DataReference::DataReference; 的目的是什么?这似乎将DataReference 构造函数拉入A_Insert 中的查找中,但无论如何它已经在那里找到了。我看不出它有什么目的,是我遗漏了什么吗?
  • 我不知道。但是我现在使用的编译器有一个不会自动执行此操作的 c++ 版本。
  • @ArthurTacca 我在没有它的情况下尝试了它,但它没有用。我不太明白,但它似乎有效。
  • 啊我明白了:我认为在... 中您打算声明另一个使用DataReference 的构造函数的构造函数。但实际上您是在建议您根本不要在派生类上编写构造函数。相反,using 会自动将 DataReference(Data& d) 转换为 A_Insert(Data& d) 构造函数。
  • 这是最接近我想要的无需编写声明类型的构造函数,因为“使用”不需要包含类型的名称。
猜你喜欢
  • 1970-01-01
  • 2020-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-05
  • 2020-04-18
  • 2018-04-02
相关资源
最近更新 更多