尝试实现 std::tie 和 std::tuple 的小版本
Trying to implement a small version of std::tie and std::tuple
所以正如标题所说,我正在尝试实现 std::tie
和 std::tuple
的一个小版本以供学习。
到目前为止,这是我的代码:
#include <iostream>
using namespace std;
template<typename T1, typename T2>
class Tuple
{
public:
T1 t1;
T2 t2;
template<typename Tr1, typename Tr2>
Tuple(Tr1 tr1, Tr2 tr2) : t1(tr1), t2(tr2)
{
}
template<typename Tr1, typename Tr2>
Tuple<T1, T2>& operator =(const Tuple<Tr1, Tr2>& other)
{
t1 = other.t1;
t2 = other.t2;
return *this;
}
};
template<typename T1, typename T2>
Tuple<T1&, T2&> Tie(T1& t1, T2& t2)
{
return Tuple<T1&, T2&>(t1, t2);
}
Tuple<int, int> f()
{
return Tuple<int, int>(3, 5);
}
int main()
{
int hi, bye;
Tie(hi, bye) = f();
cout << hi << " " << bye << '\n';
}
它几乎可以正常工作(或者至少我认为是)。
我调试看到
- Tuple(3, 5) 实例化成功。那么,
- 元组(引用 hi 和 bye)实例化成功。
- 然后最后调用赋值运算符,后者被赋值给前者,即引用被赋值给 3 和 5。
但是一旦 operator=
returns、hi
和 bye
将只有未初始化的值:(
我做错了什么?
一个错误是 operator=
return 是值,而它应该 return 是引用。但这不是原因。
原因是缺少 T1
和 T2
的构造函数,这导致它形成对值参数的引用。修复:
template<typename Tr1, typename Tr2>
Tuple(Tr1&& tr1, Tr2&& tr2)
: t1(std::forward<Tr1>(tr1))
, t2(std::forward<Tr2>(tr2))
{}
所以正如标题所说,我正在尝试实现 std::tie
和 std::tuple
的一个小版本以供学习。
到目前为止,这是我的代码:
#include <iostream>
using namespace std;
template<typename T1, typename T2>
class Tuple
{
public:
T1 t1;
T2 t2;
template<typename Tr1, typename Tr2>
Tuple(Tr1 tr1, Tr2 tr2) : t1(tr1), t2(tr2)
{
}
template<typename Tr1, typename Tr2>
Tuple<T1, T2>& operator =(const Tuple<Tr1, Tr2>& other)
{
t1 = other.t1;
t2 = other.t2;
return *this;
}
};
template<typename T1, typename T2>
Tuple<T1&, T2&> Tie(T1& t1, T2& t2)
{
return Tuple<T1&, T2&>(t1, t2);
}
Tuple<int, int> f()
{
return Tuple<int, int>(3, 5);
}
int main()
{
int hi, bye;
Tie(hi, bye) = f();
cout << hi << " " << bye << '\n';
}
它几乎可以正常工作(或者至少我认为是)。 我调试看到
- Tuple(3, 5) 实例化成功。那么,
- 元组(引用 hi 和 bye)实例化成功。
- 然后最后调用赋值运算符,后者被赋值给前者,即引用被赋值给 3 和 5。
但是一旦 operator=
returns、hi
和 bye
将只有未初始化的值:(
我做错了什么?
一个错误是 operator=
return 是值,而它应该 return 是引用。但这不是原因。
原因是缺少 T1
和 T2
的构造函数,这导致它形成对值参数的引用。修复:
template<typename Tr1, typename Tr2>
Tuple(Tr1&& tr1, Tr2&& tr2)
: t1(std::forward<Tr1>(tr1))
, t2(std::forward<Tr2>(tr2))
{}