高效地操作元组值?

7

我在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);

这个重新赋值看起来很糟糕,也不太易读。有没有更好的方法来编辑这些元组值呢?

临时变量怎么样? - m8mble
我不认为MySQL查询与实际问题有任何关系,或者它有吗? - Christian Hackl
1
它提供了为什么我使用std::tuple而不是两个整数的上下文。 - Babra Cunningham
变量名如 prestmt__ 是为实现保留的;您不应在代码中创建这样的名称。 - user2100815
@NeilButterworth,末尾的__可以吗?只有__prestmt会导致未定义的行为,不是吗? - Babra Cunningham
尾随的单个下划线是可以的 - 在自己的命名中不允许使用双下划线。在像C++这样具有强作用域的语言中,使用下划线总体上是浪费时间的。 - user2100815
1个回答

3

std::get<N>(x)返回x的第N个元素的左值引用,如果x是一个左值。因此你可以这样说:

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

wandbox示例


为了易读性,使用函数lambda表达式

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

用法:

increaseRange(range, 100);

wandbox示例


或者,考虑创建自己的integer_range类,而不是使用std::tuple。它可以支持一个extend方法来实现您想要的功能,并且具有命名字段,与std::get<N>(...)相比更易于阅读:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接