タプルによる均一な初期化 質問する

タプルによる均一な初期化 質問する

今日、私はタプルのベクトルがあり、そのタプルには複数のエントリが含まれている可能性がある状況に至りました。そこで、タプルのベクトルをオブジェクトのベクトルに変換して、タプルのエントリがオブジェクトの均一な初期化と正確に一致するようにしたいと考えました。

次のコードは私にとっては役に立ちますが、少し扱いに​​くいです。タプルがオブジェクトの均一な初期化順序と正確に一致する場合にオブジェクトを構築できる汎用的なソリューションを導き出すことができるかどうか疑問に思っています。

渡すパラメータの数が増えた場合、これは非常に望ましい機能となる可能性があります。

#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;
}

ベストアンサー1

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 vを に置き換えてconst auto& v、コンストラクターが を受け入れるようにする必要がありますconst std::tuple<Args...>& t


また、イテレータを介してソース コンテナーにアクセスすることもお勧めしますconst

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

おすすめ記事