C++ 在给定基本元组类型和可变参数索引序列的情况下定义子元组类型

问题描述 投票:0回答:1

假设我有一个元组,例如

using BaseTuple = std::tuple<int, double, string>;
,我想从给定的可变参数索引序列定义新类型,以及与 BaseTuple 相互转换的方法。例如,CustomTuple<0,1> 应派生自 tuple

using BaseTuple = tuple<int, double, string>;

template <size_t... I>
struct CustomTuple: public tuple<tuple_element_t<I, BaseTuple>...>{
    using tuple<tuple_element_t<I, BaseTuple>...>::tuple;

    static CustomTuple fromBaseTuple(const BaseTuple& key){
        return {get<I>(key)...};
    };

    BaseTuple toBaseTuple(){
        BaseTuple t;
        ((get<tuple_element_t<I, BaseTuple>>(t) = get<tuple_element_t<I, BaseTuple>>(t)), ...);
        return t;
    }
};

如果元组具有唯一类型,上面的代码就可以工作,但我想知道是否有任何方法可以处理重复类型。我找不到用它的索引迭代 I... 的方法。

c++ templates tuples variadic-templates
1个回答
0
投票

大致如下:

template <std::size_t... S>
BaseTuple toBaseTuple(std::index_sequence<S...>) {
    BaseTuple t;
    ((std::get<I>(t) = std::get<S>(*this)), ...);
    return t;
}
BaseTuple toBaseTuple(){
    return toBaseTuple(std::make_index_sequence<sizeof...(I)>{});
}

演示

© www.soinside.com 2019 - 2024. All rights reserved.