2017-02-12 50 views
5

我沒有用太多std::tuple C++和我有以下元組:有效地操縱元組值?

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

這種重新分配看起來非常差,不是很可讀。有沒有更好的編輯這些元組值的方法?

+0

怎麼樣一個臨時變量? – m8mble

+0

我不認爲MySQL查詢與真正的問題有什麼關係,或者是否? –

+1

它也提供了上下文,爲什麼我使用std :: tuple而不是兩個整數。 –

回答

2

std::get<N>(x)如果x左值返回左值參考N個元組元素。因此,你可以說:

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

wandbox example


對於可讀性,使用功能拉姆達

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