我有两个函数,first_function
和second_function
,它们有相似的签名。second_function
有两个额外的参数,x, y
。
我想创建另一个函数,它可以接受first_function
或second_function
作为参数。
我想使用std::function
,但似乎这只限于具有相同返回类型和相同参数的输入函数?有没有办法让它在我的情况下工作?
这里有一个最小的例子,我试图实现什么:
void first_function(double z) {
// Implementation not included
}
void second_function(double x, double y, double z) {
// Implementation not included
}
void compute(first_or_second_function, std::optional<double> x, std::optional<double> y, double z) {
if (x.has_value()) {
// invoke second function
first_or_second_function(x.value, y.value(), z);
} else {
// invoke first function
first_or_second_function(z);
}
}
我不确定如何创建参数first_or_second_function
4条答案
按热度按时间waxmsbnn1#
你不能自己写一个简单的functionoid吗?
如果希望函数是可替换的,则:
koaltpgm2#
您可以使用
std::variant
将函数作为单个参数传入。oug3syen3#
我有点不确定为什么你要把它传递给一个函数,让函数来决定,而不是在你提供的if语句中自己调用每个函数。
我相信您正在寻找的代码应该是这样的:
我不确定我是否会 * 推荐 * 这个解决方案,但它应该会起作用。
运行上述代码的输出:
您还应该查看:C++ template function with unknown number of arguments(如果不熟悉模板函数)。
o2g1uqev4#
一个简单的重载
compute()
就可以了。基本上提供了与具有可变参数的函数一样多的
compute()
重载。您甚至可以使用
if constexpr
根据传入的参数数量对compute()
进行模板化,如下所示