【问题标题】:Trying to implement a small version of std::tie and std::tuple尝试实现 std::tie 和 std::tuple 的小版本
【发布时间】:2018-07-19 14:47:35
【问题描述】:

所以正如标题所说,我正在尝试实现一个小版本的 std::tiestd::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= 返回,hibye 将只有未初始化的值:(

我做错了什么?

【问题讨论】:

    标签: c++ c++11 tuples std stdtuple


    【解决方案1】:

    一个错误是operator= 按值返回,而它应该按引用返回。但这不是原因。

    原因是缺少来自T1T2 的构造函数,导致它形成对值参数的引用。修复:

    template<typename Tr1, typename Tr2>
    Tuple(Tr1&& tr1, Tr2&& tr2) 
        : t1(std::forward<Tr1>(tr1))
        , t2(std::forward<Tr2>(tr2))
    {}
    

    【讨论】:

    • 确实如此。然而,这并不是程序输出不正确的原因,因为返回的值无论如何都不会在任何地方使用。
    猜你喜欢
    • 2014-07-01
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 2011-05-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多