【问题标题】:How to write a generic function that takes a lambda with a default argument?如何编写一个带有默认参数的 lambda 的通用函数?
【发布时间】:2018-08-03 17:25:45
【问题描述】:

我想将函数存储在变量中。我有一个通用的 setter 函数来分配它。如果没有指定函数,我想使用默认函数。我该如何做到这一点?

到目前为止我的代码:

void(*fmain)();

template <typename Func>
void setFunc(Func f = [](){cout << "Working!" << endl;}){
    fmain = f;
}

int main(){
    setFunc();

    fmain();
}

【问题讨论】:

  • 当参数需要隐式转换为void(*)() 时,为什么要将函数作为模板开始?
  • 好点。我什至没有想到。

标签: c++ function generics lambda default-value


【解决方案1】:

同时提供默认模板参数和(匹配的)默认函数参数:

void default_action(void) {cout << "Working!" << endl;};

template <typename Func = void ( * )(void)>
void setFunc(Func f = &default_action){
    fmain = f;
}

【讨论】:

  • 完美。我用 lambda 替换了 default_action,但它的工作方式与我想要的完全一样。但是我必须注意,我传递的函数与 fmain 的类型相同。有没有办法让它通用?谢谢
  • 想想只要fmain是一个void,这个模板永远不可能是通用的吧??
  • @user678253 修改fmain声明可以使其泛化:::std::function&lt;void (void)&gt; fmain;
  • 这不是一回事吗?如果我给它一个返回 int 的 lambda,它会中断吗?我有一种感觉是不可能的。除非有通用返回类型之类的东西。
  • @user678253 在同一个变量中存储(并稍后调用)具有不同签名的任何可调用对象是一个不同的问题。
猜你喜欢
  • 2014-10-21
  • 1970-01-01
  • 2011-07-18
  • 2016-05-22
  • 2021-10-05
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多