c++ - 用于稍后引用的 lambda 和函数的通用类型转换

标签 c++ c++11 lambda

为什么第二个例子不起作用?有没有一种方法可以使第二个示例正常工作,同时仍然将 lambda 或函数类型转换为媒体以供以后引用?

// Types I'm using
typedef void (*ANY_FUNC)(...);
typedef void (*VOID_FUNC)();

这行得通

void call_void( VOID_FUNC func) {
    ((ANY_FUNC)func)();
};

// ...

call_void([]() { /* do something */ });

这不是

template <typename fn>
void call_any( fn func ) {
    ((ANY_FUNC)func)();
};

// ...

call_any([]() { /* do something */ });

请忽略您永远不需要使用第二个示例的事实。仅供演示(相关代码)。

这两个示例都使用函数指针而不是 lambda。

最佳答案

As long as you are declaring a template you can just use the incoming function object直接地。此外,您应该将函数参数声明为引用而不是按值声明:

template <typename fn>
void call_any(fn&& func) {
    func();
};

如果你想调用带参数的函数,你可以这样做:

template <typename fn, typename... Args>
void call_any_many(fn&& func, Args&&... args) {
    func(std::forward<Args>(args)...);
};

使用示例:

int main ()
{
    call_void([]() { std::cout << "Hello, void World!" << std::endl; });
    call_any([]() { std::cout << "Hello, any World!" << std::endl; });
    call_any_many([](int x) { std::cout << "Hello, any many World-" << x << "!" << std::endl; }, 1234);

    return 0;
}

但是如果你的目的是存储一些函数指针而不是直接调用它们,我建议使用std::function来自 <functional> header 。您可以从此处查看一些信息和示例:http://en.cppreference.com/w/cpp/utility/functional/function

例如:

#include <iostream>
#include <functional>

int main ()
{
    std::function<void()> anyf = []() { std::cout << "Hello, any World!" << std::endl; };
    std::function<void(int)> intf = [](int x) { std::cout << "Hello, any many World-" << x << "!" << std::endl; };

    anyf();
    intf(1234);

    return 0;
}

关于c++ - 用于稍后引用的 lambda 和函数的通用类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14080423/

相关文章:

c++ - Visual Studio - 升级后为 "Unknown Compiler version"

c++ - 内联构造函数可以在 C++ 中使用初始化列表吗?

c# - 如何使用 System.Linq.Dynamic.Core 将复杂的查询字符串转换为 lambda 表达式

Java 8 流 : sum values on a distinct key

java - 如何序列化 lambda?

c++ - 如何使用 .h.gch 文件

c++ - 变量模板的显式特化

C++11:在 switch 语句中声明变量

c++ - emplace_back 和继承

c++ - 将成员元组传递给非成员结构而不在模板中指定它