C++ 初始化元组';s元素与另一个元组的非常量引用';不同类型的元素

C++ 初始化元组';s元素与另一个元组的非常量引用';不同类型的元素,c++,c++11,templates,c++17,C++,C++11,Templates,C++17,我正在尝试对一个std::tuple(称为w)进行转换初始化,其中包含另一个std::tuple(称为t)中大小相同但元素类型不同的元素 在我的应用程序中,w的元素必须使用对t的相应元素的非常量引用来构造 不幸的是,对于std::tuple(),只存在一个4)转换复制向量和一个5)转换移动向量。这意味着,w中的新元素只能使用const reference或rvalue reference对t的元素进行初始化,两者都不适用 例子 首先我们有一个元素修饰符类,它只绑定到其元素类型的引用 templa

我正在尝试对一个
std::tuple
(称为
w
)进行转换初始化,其中包含另一个
std::tuple
(称为
t
)中大小相同但元素类型不同的元素

在我的应用程序中,
w
的元素必须使用对
t
的相应元素的
非常量引用来构造

不幸的是,对于
std::tuple
(),只存在一个
4)转换复制向量
和一个
5)转换移动向量
。这意味着,
w
中的新元素只能使用
const reference
rvalue reference
t
的元素进行初始化,两者都不适用

例子 首先我们有一个元素修饰符类,它只绑定到其元素类型的引用

template<typename T>
struct SingleElementModifier {
    T& ref;
    SingleElementModifier(T& ref) : ref(ref) { }
};
现在我们有了一个
TupleModifier
,它接受一个tuple
t
并存储一个tuple
w
,第一个tuple的每个元素都有修饰符

template<typename Tuple>
struct TupleModifier {
    using TupleType = typename ModifierTuple<Tuple>::Type;
    TupleType w;
    TupleModifier(Tuple& t) : w{ t } { }
};

在这里,编译器将停止并向我抱怨,由于开头解释的原因,
w{t}
的构造函数找不到

糟糕的解决方法
理论上,我可以使用
SingleElementModifier
获取一个
const T&
并使用
const\u cast
来去除const,但我希望找到一个更好的解决方案,不需要我放弃const的正确性。

你只需要一点间接的方法:

template<typename Tuple>
struct TupleModifier {
    using TupleType = typename ModifierTuple<Tuple>::Type;
    TupleType w;
    TupleModifier(Tuple& t)
        : TupleModifier{ t, std::make_index_sequence<std::tuple_size<Tuple>::value>() }
    {}

private:
    template <std::size_t ... Is>
    TupleModifier(Tuple& t, std::index_sequence<Is...>) : w{ std::get<Is>(t)...} { }
};
模板
结构元组修改器{
使用TupleType=typename ModifierType::Type;
元组型w;
元组修改器(Tuple&t)
:TupleModifier{t,std::make_index_sequence()}
{}
私人:
模板
元组修改器(Tuple&t,std::index_序列):w{std::get(t)…}{
};

int main() {
    /* just some example types, could be any type inside. */
    std::tuple<double, std::pair<int, int>> t;
    TupleModifier mod(t);
}
template<typename Tuple>
struct TupleModifier {
    using TupleType = typename ModifierTuple<Tuple>::Type;
    TupleType w;
    TupleModifier(Tuple& t)
        : TupleModifier{ t, std::make_index_sequence<std::tuple_size<Tuple>::value>() }
    {}

private:
    template <std::size_t ... Is>
    TupleModifier(Tuple& t, std::index_sequence<Is...>) : w{ std::get<Is>(t)...} { }
};