如何在元组上使用std::get赋值

How to assign a value using std::get on a tuple?

本文关键字:std get 赋值 元组      更新时间:2023-10-16

我需要在代码中使用元组,以便能够方便地在向量中存储三个不同类型的数据。也就是说,我有这样的东西:

std::vector<std::tuple<sf::Time, sf::Time, std::function<void()> > > m_timedFunctions;

其中,第一个sf::Time表示我们应该多久调用一次std::函数,第二个sf::Time表示最后一次调用该函数的时间戳。目标是能够以规则的间隔自动调用函数。

创建元组并将其插入向量中没有问题,但由于某种原因,当我尝试使用std::get<1>(u)修改第二个sf::Time时,它根本不会发生。我可以完美地读取数据,但它决不能让我修改它

以下是我如何创建元组:

void addTimedFunction(sf::Time freq, std::function<void()> f)
{
    auto a = std::make_tuple(freq, sf::seconds(0), f);
    m_timedFunctions.push_back(a);
}

但后来如果我做这样的事情:std::get<1>(a) = sf::seconds(10);(其中a是来自m_timedFunctions的元组,我得到它的基为range),则第二个成员保持在0。

我修改代码的整个部分:

void MainWindow::processTimedFunctions()
{
    for(auto a : m_timedFunction)
    {
        sf::Time elapsed = m_clock.getElapsedTime();
        sf::Time lastExec = std::get<1>(a);
        sf::Time diff = elapsed - lastExec;
        if( diff.asMilliseconds() >= std::get<0>(a).asMilliseconds())
        {
            std::get<1>(a) = sf::seconds(10); //   m_clock.getElapsedTime();    // Update the last execution time
            std::get<2>(a)();             // Call the linked function
        }
    }
}

如何有效地修改它?

这会创建您正在迭代的元素的副本:

for(auto a : m_timedFunction)

a所做的任何更改都不会影响容器。

要获得参考而不是副本,请使用:

for(auto &a : m_timedFunction)