有效地操纵元组值?

Bab*_*ham 5 c++ tuples

std::tuple在C++ 中用得不多,我有以下元组:

std::tuple<int, int> range {0, 100};
Run Code Online (Sandbox Code Playgroud)

这是我的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));
Run Code Online (Sandbox Code Playgroud)

我正在使用元组结构来清楚地表明两个整数在函数的操作中耦合在一起.

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

range = std::tuple<int, int>(std::get<0>(range) + 100, std::get<0>(range) + 100);
Run Code Online (Sandbox Code Playgroud)

这种重新分配看起来很糟糕,并且不太可读.有没有更好的方法来编辑这些元组值?

Vit*_*meo 3

std::get<N>(x)如果是左值,则返回对第 th 元组元素的左引用。因此你可以说:Nx

std::get<0>(range) += 100;
std::get<1>(range) += 100;
Run Code Online (Sandbox Code Playgroud)

魔杖盒示例


为了便于阅读,请使用函数lambda

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

用法:

increaseRange(range, 100);
Run Code Online (Sandbox Code Playgroud)

魔杖盒示例


或者,考虑创建自己的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;
    }
};
Run Code Online (Sandbox Code Playgroud)

魔杖盒示例