c++定时器回调函数怎么传容器参数
时间: 2024-04-01 15:14:31 浏览: 10
在C++中,定时器回调函数可以使用函数指针或者函数对象的方式来定义。如果你的回调函数需要传递一个容器参数,可以使用以下两种方法:
1. 使用函数对象
可以定义一个带有容器参数的函数对象,并将其作为回调函数传递给定时器。例如:
```c++
#include <iostream>
#include <vector>
#include <functional>
#include <chrono>
#include <thread>
class Timer
{
public:
template<typename Function>
void setTimeout(Function function, int delay)
{
std::thread t([=]()
{
std::this_thread::sleep_for(std::chrono::milliseconds(delay));
function();
});
t.detach();
}
};
void printVector(std::vector<int>& vec)
{
for (auto i : vec)
{
std::cout << i << " ";
}
std::cout << std::endl;
}
int main()
{
std::vector<int> vec = { 1, 2, 3 };
Timer timer;
timer.setTimeout([&vec]()
{
printVector(vec);
}, 1000);
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
return 0;
}
```
在这个例子中,我们定义了一个`Timer`类,其中的`setTimeout`函数接收一个函数对象和延时时间,然后在延时时间结束后执行该函数对象。我们定义了一个`printVector`函数,它接收一个`std::vector<int>`类型的参数,并打印出其中的元素。在`main`函数中,我们创建了一个包含三个整数的`vector`,并将其作为参数传递给了一个延时1秒后执行的函数对象。
2. 使用函数指针
如果你想使用函数指针来传递容器参数,需要将容器作为指针参数传递给回调函数。例如:
```c++
#include <iostream>
#include <vector>
#include <functional>
#include <chrono>
#include <thread>
class Timer
{
public:
typedef void(*Callback)(std::vector<int>*);
void setTimeout(Callback callback, std::vector<int>* vec, int delay)
{
std::thread t([=]()
{
std::this_thread::sleep_for(std::chrono::milliseconds(delay));
callback(vec);
});
t.detach();
}
};
void printVector(std::vector<int>* vec)
{
for (auto i : *vec)
{
std::cout << i << " ";
}
std::cout << std::endl;
}
int main()
{
std::vector<int> vec = { 1, 2, 3 };
Timer timer;
timer.setTimeout(printVector, &vec, 1000);
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
return 0;
}
```
在这个例子中,我们定义了一个指向`printVector`函数的函数指针,并将包含三个整数的`vector`作为指针参数传递给了该函数。在`setTimeout`函数中,我们使用了类似的方式将该函数指针和`vector`指针作为参数传递给了定时器回调函数。在回调函数中,我们通过解引用`vector`指针来访问该容器的元素。