c++ - 有效地操纵元组值?

标签 c++ tuples

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

wandbox example


为了可读性,使用函数lambda:

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<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

关于c++ - 有效地操纵元组值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42190868/

相关文章:

c++ - 使用 cxxtest 框架和 valgrind 测试 qt 对象

c++ - 是否可以避免 C++ 编译器错误 (C2757),其中 2 个不同的头文件包含相同的命名空间和类符号?

java - 如何从 Java/Spring 创建类型化的 Tuple2?

python - 在 Python 中将一个元组添加到一个元组

c++ - 为什么 ={} 初始化不适用于元组?

c++ - Boost-Spirit:将列表解析为结构的不同字段

c++ - 优化昂贵函数的调用次数

c++ - 在 C++ 中有效地乘以常数分数

python - 遍历包含元组的字典

Haskell:带元组的映射函数