使用宏将实例名称作为 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);
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
.
更准确地说,我有一个 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);
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
.