gpt4 book ai didi

C++ 在映射中存储变体类型

转载 作者:行者123 更新时间:2023-11-30 04:44:34 25 4
gpt4 key购买 nike

在 C++ 中,我想创建一个定义数据管道的函数对列表。例如,给定这样的东西:

FieldName: "F1"
ParserFunction: X ParseX(string s)
DestinationFn: void Consume(X& f1)

FieldName: "F2"
ParserFunction: Y ParseY(string s)
DestinationFn: void Consume(Y& f2)

我希望能够将此列表存储在类似 map 的数据结构中,其中给定字段名称和数据的字符串,将调用正确的解析器和消费者。

到目前为止我想出的最好的是这样的:

using ParseResult = std::variant< X, Y >;
map< string, pair< std::function<ParseResult(string)>, std::function<void(ParseResult)>>

这允许自然地编写解析器(并且可以重用现有的解析器):

int StringToInt(const string& s) { return 42; }

但消费者必须使用变体:

void ConsumeInt(ParseResult i) { foo = std::get<int>(i); }

这可行,但如果参数实际上不携带整数,则可能会出现运行时错误。这也意味着对于任何给定的应用程序,Variant 类型必须声明所有可能的类型。对于可以包含大量类型的长转换器列表。

有没有一种方法可以声明映射的内容,以便每一行在构造时都是完全类型安全的,但这些行是类型变体(或类型删除)?

换句话说,我想要:

void TypesafeIntegerSink(int i) { ... }

我的 map 初始化程序是这样读的:

mymap = {
{ "F1", { StringToInt, TypesafeIntegerSink } },
{ "F2", { StringToX, TypesafeXSink } },
....
}

我想知道是否有一种巧妙的方法来构造它,以便在 F1 解析器不返回 int 或 F1 sink 不采用 int 等情况下编译失败。

最佳答案

显而易见的解决方案是只使用一个函数来解析和使用一个字符串,然后直接用一个小的 lambda 构建它:

std::map<std::string, std::function(void(std::string))> mymap = {
{ "F1", [](std::string in) { TypesafeIntegerSink(StringToInt(in)); } },
{ "F2", [](std::string in) { TypesafeXSink(StringToX(in)); } },
...

关于C++ 在映射中存储变体类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57702647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com