【发布时间】:2012-12-01 11:28:21
【问题描述】:
有没有办法在向量中存储具有不同参数的 void 函数?参数的数量总是一个,只是类型不同。参数类型可以是int 等默认类型,example* 等指向我自己的对象的指针或任何其他类型。
我现在所做的是使用带有 void 指针作为参数的函数向量。所以我可以通过一切。但我想摆脱所有功能中的回投。
unordered_map<string, function<void(void*)> > List;
void Callback(string Name, function<void(void*)> Function)
{
List[Name].push_back(&Function);
}
Callback("event", [](void* x){
int value = *(int*)x;
cout << value << endl;
});
这里有一个例子来说明我想要什么。请注意我喜欢的模板语法。因此,我需要将所有功能存储在一个容器中。
vector<function<void(...)> > List; // need something other than a std vector
template <typename T>
void Callback(string Name, function<void(T)> Function)
{
List[Name].push_back(&Function);
}
Callback<int>([](int x){
cout << x << endl;
});
此应用程序与性能相关,因为它是实时渲染引擎的重要组成部分。
编辑:我解决了存储没有参数的函数的问题,所以这不再是问题的一部分,是什么让问题更加清晰和直接。
【问题讨论】:
-
在调用现场,你怎么知道使用哪种参数类型?
-
现在,它也是一个空指针。但我也想将其模板化。
-
有趣的信息是您如何知道使用哪种类型,而不是您当前如何表示它。假设您有
vector<Foo> v,其中Foo是正确的类型。你想打电话给v[3](x)。你想要x是什么类型的? -
所有回调函数都有一个约束条件,即没有参数或与事件提供的参数相同。例如,事件
WindowResize为新的高度和宽度提供Vector2i。所有注册的回调必须没有或只有一个Vector2i参数。但正如我所说,我的实际实现使用 void 指针,所以只有程序员知道类型。 -
因此程序员知道
WindowResize具有Vector2i等类型的数据,并且他希望仅使用该语言的静态类型安全结构来表达此知识。为什么他将所有可能类型的所有回调集中在同一个向量中?通过这样做,他丢掉了知识。为什么不将接受int的回调与接受Vector2i等不同类型的不同变量的回调分开?然后每个事件类型都会知道在哪里可以找到相关的回调。
标签: c++ function templates pointers containers