用 c++ std::map 和 std::function 实现一个 可变参数的 回调映射
时间: 2023-10-24 07:23:01 浏览: 272
C++可变参数的实现方法
好的,这是一个有趣的问题。首先,我们需要定义一个回调函数的类型,它应该接受任意数量和类型的参数并返回一个 void 指针,以便我们可以存储任何类型的回调函数。这可以使用 std::function 来实现,如下所示:
```c++
typedef std::function<void*(std::initializer_list<void*>)> Callback;
```
接下来,我们需要一个映射来存储回调函数,这可以使用 std::map 来实现。我们将使用字符串作为键,将回调函数作为值。如下所示:
```c++
std::map<std::string, Callback> callbacks;
```
现在我们可以编写一个添加回调函数的函数,它将接受一个字符串键和一个回调函数,并将它们存储在映射中。如下所示:
```c++
void AddCallback(const std::string& key, const Callback& callback)
{
callbacks[key] = callback;
}
```
最后,我们需要一个函数来调用回调函数。这个函数将接受一个字符串键和一个可变数量的参数,并查找存储在映射中的回调函数,然后调用它。如下所示:
```c++
template<typename... Args>
void* CallCallback(const std::string& key, Args... args)
{
auto it = callbacks.find(key);
if (it == callbacks.end())
{
return nullptr;
}
std::initializer_list<void*> params = { &args... };
return it->second(params);
}
```
现在我们可以使用 AddCallback 函数添加回调函数,然后使用 CallCallback 函数调用它们。下面是一个完整的例子:
```c++
#include <map>
#include <functional>
#include <initializer_list>
typedef std::function<void*(std::initializer_list<void*>)> Callback;
std::map<std::string, Callback> callbacks;
void AddCallback(const std::string& key, const Callback& callback)
{
callbacks[key] = callback;
}
template<typename... Args>
void* CallCallback(const std::string& key, Args... args)
{
auto it = callbacks.find(key);
if (it == callbacks.end())
{
return nullptr;
}
std::initializer_list<void*> params = { &args... };
return it->second(params);
}
void* MyCallback(std::initializer_list<void*> args)
{
int a = *static_cast<int*>(args.begin());
float b = *static_cast<float*>(args.begin() + 1);
std::string c = *static_cast<std::string*>(args.begin() + 2);
printf("a = %d, b = %f, c = %s\n", a, b, c.c_str());
return nullptr;
}
int main()
{
AddCallback("my_callback", MyCallback);
int a = 123;
float b = 3.14f;
std::string c = "hello world";
CallCallback("my_callback", a, b, c);
return 0;
}
```
这个例子中,我们定义了一个名为 MyCallback 的回调函数,它接受一个整数、一个浮点数和一个字符串作为参数,并将它们打印到控制台上。然后我们使用 AddCallback 函数将这个回调函数添加到映射中,并使用 CallCallback 函数调用它。
阅读全文