我在 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);
这个重新赋值看起来很糟糕而且可读性不强。有没有更好的方法来编辑这些元组值?
最佳答案
std::get<N>(x)
返回 N
的左值引用 th 元组元素 if x
是一个左值。因此你可以说:
std::get<0>(range) += 100;
std::get<1>(range) += 100;
为了可读性,使用函数或lambda:
const auto increaseRange = [](auto& x, auto increment)
{
std::get<0>(x) += increment;
std::get<1>(x) += increment;
};
用法:
increaseRange(range, 100);
或者,考虑创建您自己的 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;
}
};
关于c++ - 有效地操纵元组值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42190868/