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
,它接受一个tuplet
并存储一个tuplew
,第一个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)...} { }
};