gpt4 book ai didi

c++ - 如何删除元组初始化 vector 中的样板文件?

转载 作者:搜寻专家 更新时间:2023-10-31 01:28:17 25 4
gpt4 key购买 nike

我想像这样初始化一个 5 元组字符串列表:

std::vector<std::tuple<std::string,std::string,std::string,std::string,std::string> >
examples =
{
{"/foo" ,"/" ,"foo" ,"" ,"foo"},
{"/foo/" ,"/" ,"foo" ,"" ,"foo"},
{"/foo//" ,"/" ,"foo" ,"" ,"foo"},
{"/foo/./" ,"/foo" ,"." ,"" ,""},
{"/foo/bar" ,"/foo" ,"bar" ,"" ,"bar"},
{"/foo/bar." ,"/foo" ,"bar." ,"" ,"bar"},
{"/foo/bar.txt" ,"/foo" ,"bar.txt" ,"txt","bar"},
{"/foo/bar.txt.zip" ,"/foo" ,"bar.txt.zip","zip","bar.txt"},
{"/foo/bar.dir/" ,"/foo" ,"bar.dir" ,"dir","bar"},
{"/foo/bar.dir/file" ,"/foo/bar.dir","file" ,"" ,"file"},
{"/foo/bar.dir/file.txt","/foo/bar.dir","file.txt" ,"txt","file"}
};

This question询问为什么嵌套初始化列表不能用于元组 vector :答案说使用 std::make_tuple .但这让我的代码看起来很荒谬:

std::vector<std::tuple<std::string,std::string,std::string,std::string,std::string> >
examples =
{
std::make_tuple<std::string,std::string,std::string,std::string,std::string>("/foo" ,"/" ,"foo" ,"" ,"foo"),
std::make_tuple<std::string,std::string,std::string,std::string,std::string>("/foo/" ,"/" ,"foo" ,"" ,"foo"),
std::make_tuple<std::string,std::string,std::string,std::string,std::string>("/foo//" ,"/" ,"foo" ,"" ,"foo"),
std::make_tuple<std::string,std::string,std::string,std::string,std::string>("/foo/./" ,"/foo" ,"." ,"" ,""),
std::make_tuple<std::string,std::string,std::string,std::string,std::string>("/foo/bar" ,"/foo" ,"bar" ,"" ,"bar"),
std::make_tuple<std::string,std::string,std::string,std::string,std::string>("/foo/bar." ,"/foo" ,"bar." ,"" ,"bar"),
std::make_tuple<std::string,std::string,std::string,std::string,std::string>("/foo/bar.txt" ,"/foo" ,"bar.txt" ,"txt","bar"),
std::make_tuple<std::string,std::string,std::string,std::string,std::string>("/foo/bar.txt.zip" ,"/foo" ,"bar.txt.zip","zip","bar.txt"),
std::make_tuple<std::string,std::string,std::string,std::string,std::string>("/foo/bar.dir/" ,"/foo" ,"bar.dir" ,"dir","bar"),
std::make_tuple<std::string,std::string,std::string,std::string,std::string>("/foo/bar.dir/file" ,"/foo/bar.dir","file" ,"" ,"file"),
std::make_tuple<std::string,std::string,std::string,std::string,std::string>("/foo/bar.dir/file.txt","/foo/bar.dir","file.txt" ,"txt","file")
};

如果我无法摆脱 std::make_tuple<...> , 我可以至少使用 typedefusing消除代码中的困惑?

using StringQuintet = std::tuple<std::string,std::string,std::string,std::string,std::string>;没有帮助,因为 std::make_tuple<...>只需要元组模板参数而不是元组类型。

有什么好的方法可以清理这个看起来一团糟的样板文件吗?

最佳答案

 std::make_tuple<std::string,std::string,std::string,std::string,std::string>("/foo"                 ,"/"           ,"foo"        ,""   ,"foo"),

您不传递类型来生成元组。

std::make_tuple("/foo"                 ,"/"           ,"foo"        ,""   ,"foo"),

您让编译器推断它们。或者:

std::make_tuple("/foo"s                 ,"/"s           ,"foo"s        ,""s   ,"foo"s),

拥有标准字符串文字(using namespace std::literals; 允许这样做)。

或者:

using StringQuintet = std::tuple<std::string,std::string,std::string,std::string,std::string>;
// ...
StringQuintet("/foo" ,"/" ,"foo" ,"" ,"foo"),

关于c++ - 如何删除元组初始化 vector 中的样板文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52509294/

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