c++ - 传递非泛型函数的最有效方法是什么?

标签 c++ function functor std-function

我正在学习 C++ 中的函数式编程。我的意图是传递一个非泛型函数作为参数。我知道模板方法,但是我想将函数签名限制为 API 设计的一部分。我制定了 4 种不同的方法 example on cpp.sh :

// Example program
#include <iostream>
#include <string>
#include <functional>

typedef int(functor_type)(int);


int by_forwarding(functor_type &&x)  {
    return x(1);
}

int functor_by_value(functor_type x) {
    return x(1);
}

int std_func_by_value(std::function<functor_type> x) {
    return x(1);
}

int std_func_by_forwarding(std::function<functor_type> &&x) {
    return x(1);
}

int main()
{
    std::cout << functor_by_value([](int a){return a;}); // works
    std::cout << std_func_by_value([](int a){return a;}); // works
    std::cout << std_func_by_forwarding(std::move([](int a){return a;})); // works

    //std::cout << by_forwarding([](int a){return a;}); // how to move lambda with forwarding ?
}

以上尝试是否正确?如果没有,我该如何实现我的目标?

最佳答案

(基于评论的澄清)

可以使用 std::is_invocable:

限制签名
template<typename x_Action> auto
functor_by_value(x_Action && action)
{
    static_assert(std::is_invocable_r_v<int, x_Action, int>);
    return action(1);
}

online compiler

关于c++ - 传递非泛型函数的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51873464/

相关文章:

c++ - BGL : get vertex descriptor with data

c++ - while循环错误c++

c++ - Boost-Asio:如何处理来自控制台和网络的流数据?

在函数中作为结构体传递并返回后创建 C 库

python - 无法合并两个已排序的单链表,因为 "type object ' _Node' 没有属性 '_element' "

c++ - 关于STL仿函数的使用,更大的<T>

c++ - 为什么 STL 仿函数本身是模板化的,而不是它们的函数调用运算符?

c++ - Visual Studio 2010 中新 ATL 项目的资源 ID 差距

java - 从脚本文件调用 jar 文件内的函数

c++ - Functor - 他们对其他没有实现运算符 ( ) 的类有什么权力