c++ - 元组统一初始化

标签 c++ stl stl-algorithm stdtuple uniform-initialization

今天,我遇到了一种情况,我有一个元组 vector ,其中元组可能包含多个条目。现在我想将我的元组 vector 转换为对象 vector ,这样元组的条目将完全匹配我的对象的统一初始化。

以下代码为我完成了这项工作,但有点笨拙。我问自己,如果元组与对象的统一初始化顺序完全匹配,是否有可能派生一个可以构造对象的通用解决方案。

当要传递的参数数量增加时,这可能是一个非常理想的功能。

#include <vector>
#include <tuple>
#include <string>
#include <algorithm>

struct Object
{
    std::string s;
    int i;
    double d;
};

int main() {
    std::vector<std::tuple<std::string, int, double>> values = { {"A",0,0.},{"B",1,1.} };

    std::vector<Object> objs;
    std::transform(values.begin(), values.end(), std::back_inserter(objs), [](auto v)->Object
        {
        // This might get tedious to type, if the tuple grows
            return { std::get<0>(v), std::get<1>(v), std::get<2>(v) };
           // This is my desired behavior, but I don't know what magic_wrapper might be
            // return magic_wrapper(v);
        });

    return EXIT_SUCCESS;
}

最佳答案

提供Object一个 std::tuple构造函数。您可以使用 std::tie 分配您的成员:

template<typename ...Args>
Object(std::tuple<Args...> t) {
    std::tie(s, i, d) = t;
}

现在它会自动构建:

std::transform(values.begin(), values.end(), std::back_inserter(objs), 
    [](auto v) -> Object {
        return { v };
    });

要减少复制量,您可能需要替换 auto vconst auto& v并使构造函数接受 const std::tuple<Args...>& t .


另外,最好通过 const 访问源容器。迭代器:

std::transform( values.cbegin(), values.cend() , std::back_inserter(objs), ...

关于c++ - 元组统一初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56899054/

相关文章:

c++ - 如何使用 IDL 编译器在临时目录中构建中间 C++ 文件?

c++ - 如何从 C++ 数组中删除重复项?

c++ - 为什么C++标准库中没有std::transform_n函数?

c++ - 如果我知道它的地址,我能以某种方式访问​​它吗?

C++ 奇怪的文件输出

C++ 未按预期打印表情符号

c++ - 如何更改适配器容器的基本底层容器类型?

c++ - 简单独特的STL容器

c++ - std::set `erase ( const key_type& x )` 是否以与 ` erase ( collection.find( x ) );` 相同的方式在 STL 中实现?

c++ - std::shuffle 的使用和效用?