【问题标题】:Instantiate an object and pass its name to constructor using c++ macro使用 c++ 宏实例化一个对象并将其名称传递给构造函数
【发布时间】:2021-11-27 16:07:14
【问题描述】:

我们说

class A {
   A(string name) {
       //....
   }
}

所以当对象被创建时:

A* objectNumber324 = new A("objectNumber324");
A* objectNumber325 = new A("objectNumber325");

在我的例子中,由于对象名称很长,我正在寻找宏来将该代码简化为:

CreateA(objectNumber325);

有一些讨论如何将变量名传递给函数here。但这并不完全相同,因为我想创建对象并将其名称传递给构造函数。

【问题讨论】:

  • 这几乎不是你真正想做的事情,这看起来很像XY problem。但是,您可以使用与您链接的完全相同的技术;只需编写一个扩展为声明的宏。
  • 使用与变量相同的“名称”的用例是什么?那应该解决什么问题?为什么你不能做例如std::vector<A> objects; 然后objects.emplace_back("objectNumber324"); (如果你想要顺序编号,可能在循环中)?
  • CreateA 的定义是什么?
  • @Someprogrammerdude 这实际上是在创建一些低级芯片建模,这些对象具有非常相似的名称,例如端口连接,并且数量很多。这些名称应打印在日志中。保持代码和日志可读性的主要原因。
  • 那么您绝对应该使用对象向量(或其他一些标准容器,也许std::unordered_map 将“id”映射到对象)而不是不同且单独的变量。

标签: c++ macros


【解决方案1】:
#include <string>
#include <iostream>

#define CreateA(name) \
        A* name = new A(#name)

// With type
#define CREATE_WITH_TYPE(type, name) \
        type* name = new type(#name)

// With name decoration
#define CREATE_WITH_DECO(type, name) \
        type* my_##name = new type(#name)

class A {
public:
   A(std::string name){
       std::cout << name << " created.\n";
   }
};

int main() {
    // example
    CreateA(objectNumber325);
    CREATE_WITH_TYPE(A, objectNumber324);
    CREATE_WITH_DECO(std::string, a_string);
    delete objectNumber324;
    delete objectNumber325;
    delete my_a_string;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多