【问题标题】:Efficiently manipulating tuple values?有效地操纵元组值?
【发布时间】:2017-02-12 17:33:12
【问题描述】:

我在 C++ 中很少使用 std::tuple,我有以下元组:

std::tuple<int, int> range {0, 100};

这是我的 mysql 查询的范围:

prestmt_ = con_ -> prepareStatement("SELECT example_value FROM example_table  WHERE example_column = '0' LIMIT ?, ?");
prestmt_ -> setInt(1, std::get<0>(range));
prestmt_ -> setInt(2, std::get<1>(range));

我用元组结构来说明两个整数在函数的操作中是耦合在一起的。

我需要在每次查询后递增两个元组整数:

range = std::tuple<int, int>(std::get<0>(range) + 100, std::get<0>(range) + 100);

这个重新分配看起来很糟糕,可读性也不是很好。有没有更好的方法来编辑这些元组值?

【问题讨论】:

  • 临时变量怎么样?
  • 我不认为 MySQL 查询与实际问题有任何关系,或者是吗?
  • 它也提供了上下文以及为什么我使用 std::tuple,而不是两个整数。
  • prestmt__ 这样的变量名是为实现而保留的;你不应该在你的代码中创建这样的名字。
  • @NeilButterworth 尾随 __ 可以吗?不只是__prestmt 会导致未定义的行为吗?

标签: c++ tuples


【解决方案1】:
如果x 是一个左值

std::get&lt;N&gt;(x) 会返回一个对Nth 元组元素的左值引用。因此,您可以说:

std::get<0>(range) += 100;
std::get<1>(range) += 100;

wandbox example


为了便于阅读,请使用 functionlambda

const auto increaseRange = [](auto& x, auto increment)
{
    std::get<0>(x) += increment;
    std::get<1>(x) += increment;
};

用法:

increaseRange(range, 100);

wandbox example


或者,考虑创建自己的integer_range 类,而不是使用std::tuple。它可以支持extend 方法,该方法可以满足您的需求,并且具有命名字段,与std::get&lt;N&gt;(...) 相比,它更易于阅读:

template <typename T>
struct integer_range
{
    T _begin, _end;

    constexpr integer_range(T begin, T end) noexcept
        : _begin{begin}, _end{end} 
    {
        assert(_end >= _begin); // additional safety
    }

    void extend(T increment) noexcept
    {
        _begin += increment;
        _end += increment;
    }
};

wandbox example

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    • 2012-09-09
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 2015-10-02
    • 2011-08-23
    相关资源
    最近更新 更多