是否可以在 C++ 中使用模板将功能链接到类成员名称?

Can templates be used in C++ to link functionality to a class member name?

提问人:cvomake 提问时间:3/2/2023 最后编辑:cvomake 更新时间:3/2/2023 访问量:72

问:

这个问题反复出现,多年来一直困扰着我。这可能是一件众所周知的事情,但不知何故,我还没有到那本书来回答它。

我有一个创建消息的应用程序。消息包含具有值或为 null 的字段,这些字段由 setField1()/setNullField1() 等方法设置。

我想编写代码,以通用方式对消息中的此类字段进行编码,例如使用模板而不是宏。 代码是通用的,因为算法是相同的,但应该为字段调用的方法取决于该字段名称,例如 setField1/setNullField1。

在我看来,在 C++ 中应该可以在字段名称和必须调用的方法(方法名称中包含字段名称)之间建立这种关系,而无需使用宏。

您能分享一些关于如何做到这一点的想法吗? 我可能对模板与宏的限制有不正确的理解,所以如果是这种情况,请纠正我

更新由于要求代码来描述一个问题,这里有一些代码 https://onlinegdb.com/cu-Gpsahz 但请注意,这正是我的问题,我无法编写此代码,也不确定这是否是正确的策略(例如使用unordered_map)

C++ Templates Methods 成员

评论

0赞 Pepijn Kramer 3/2/2023
不可以,您不能使用模板为您填写函数/变量名称。即使我绝对更喜欢模板,这也是我仍然时不时地使用宏的原因之一。我知道没有宏的最接近的事情是注入 lambda 函数来执行 set/get 到通用代码中。(那么函数参数是模板化的参数)
0赞 cvomake 3/2/2023
@PepijnKramer 我不是在寻找直接的解决方案,而是可能使用“另一个间接层次”来解决这个问题
0赞 Pepijn Kramer 3/2/2023
不太确定这是否有帮助,但我的意思是这样的:onlinegdb.com/FJsLWS2w3x
0赞 cvomake 3/2/2023
@PepijnKramer 在您的代码中,没有成员,也没有依赖于它的方法名称。在我的理解中,您只是调用这两个方法common_code因为这两个方法将生成两次:一次是因为您使用指向不同成员方法的指针调用它。此外,您可以保留您的_int和_double,因为它们无论如何都可以通过参数类型解析,请参阅 onlinegdb.com/LkabGZzn8
1赞 Caleth 3/2/2023
你要求这样的东西吗?struct Message { std::optional<int> Field1; };

答: 暂无答案