使用宏将实例名称作为 std::string 添加到构造函数参数

Add the instance name to the constructor arguments as an std::string with Macros

更准确地说,我有一个 class:

struct S 
{
    template <class... T>
    S(std::string instance_name, T*... ptrs);
}

需要以如下方式构建:

STRUCT(example(arg1, arg2, arg3));

其中 STRUCT 是扩展为的宏:

S example(std::string("example"), arg1, arg2, arg3);

我一直在尝试 #define X(a) #a,但无法弄清楚如何使它全部正常工作。

谢谢

编辑:

我有一张地图,其中包含成对的 <std::string, void*>,其中存储了函数指针。存储在那里的那些函数有一个带有签名的对应函数:example(Args args),其中两个函数具有相同的参数。 所以我在地图中有条目,例如 ("example", &example_counterpart) 我希望用户能够调用 example_counterpart(...) 类似的东西:OTHER(example(Args args));

你给出的解决方案很接近,但是函数是用MACRO(example, arg1, arg2)调用的(在S的构造函数中),这不是我需要的。

我对实现此目标的其他建议持开放态度,class 的使用只是我的一个想法,但这并不重要,我无法改变的是我将这些对应函数存储在一个地图,我需要用某种标志来调用它们,以将其与正常的函数调用区分开来。

我希望我的意图是明确的,即使原因可能不明确

建议:

#define STRUCT(inst,...) S inst(std::string(#inst),__VA_ARGS__)

它的使用方式与您想要的略有不同:

STRUCT(example, arg1, arg2, arg3);

... 但它会扩展到您想要的:

S example(std::string("example"), arg1, arg2, arg3);

Demo

STRUCT(example(arg1, arg2, arg3)) 将用 a=example(arg1, arg2, arg3) 扩展宏 #define STRUCT(a) ...。因此,#a 将是 "example(arg1, arg2, arg3)".

您将需要 example 的类型,并且该类型将需要捕获 #a。 IE。 Helper<S, #a>Helper<S, const char* name>S 派生的模板 class。小问题:you can't pass that string literal directly,您需要将其捕获在辅助变量中。

Helper<S, name> 中,您需要 (constexpr) 解析 name,并且 Helper<S>::Helper(T*...args) 的初始化列表需要传递解析的名称和 args...下降到 S::S.