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

标签 c++ c++11 tuples boilerplate list-initialization

我想初始化一个 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),

拥有 std 字符串文字(使用命名空间 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/

相关文章:

python - 释放元组的元素?

scala - 将元组添加到集合中不起作用

c++ - 尝试(但失败)在 Windows 10 的 64 位 Ubuntu 上运行 Hello World 32 位 C++ 程序

c++ - 3D vector 的角度 - 获得两者

c++ - 可变参数子集

c++ - 识别范围(或容器)中元素类型的可靠方法

c++ - 检测 Spirit 语义 Action 中的参数类型

c++ - 将 3rd 方头文件放在源代码树中的什么位置?

c++ - 实现类似async的功能

templates - D中解析模板元组参数