【发布时间】:2023-02-24 19:24:26
【问题描述】:
class Base{
template<F>
void Foo(int x, int y, F callback) {
int z, w;
std::string str;
/*
do a lot of works get value of str, z and w
*/
callback();
/*
or callback(z, w);
or callback(str);
*/
}
int main() {
Foo(1, 2, [](){
std::cout << "no parameter";
});
Foo(1, 2, [](int z, int w){
std::cout << z << w<< "two parameters";
});
Foo(1, 2, [](string str){
std::cout << str.size() << "string parameter";
});
}
本来我有几个几乎相同的函数,但是每个函数内部还是有一些差异无法合并。
我想通过传递不同的回调来处理这些差异,但是找不到统一的回调接口,因为差异不是很相似。
有没有优雅的方法来处理这种情况?谢谢你帮助我。
【问题讨论】:
-
让你所有的回调都接受所有三个参数,即使它们不需要它们?真的,我们需要更多背景信息。删除了多余的标签。
-
您使用模板
F的方法允许任何数量的参数,包括没有。但你需要决定Foo真正做了什么,以及它需要传递什么参数(如果有的话)。如果你想在Foo函数中做不同的事情,那么你真的应该让不同的函数都做一件事情。如果函数之间有公共代码,则将它们放入不同的Foo变体可以调用的其他函数中。 -
您是在问如何处理可能具有三个预定签名之一的回调吗?或者您是在询问如何调用可以具有任意数量的任意类型参数的函数?
标签: c++