从外部获取函数指针的简洁方法 std::function

Clean way to get function pointer from external std::function

因为 C,我需要一个 函数指针 来自我在运行时收到的 std::function
让我们调用 defineProxyCallbackunsigned char 函数作为输入的 C 函数。 我使这项工作的技巧是:

struct callBacker {
    std::function<void(unsigned char)> normalKey;
};
callBacker cb = callBacker();
extern callBacker cb;
void proxy(unsigned char c) { cb.normalKey(c); };

void maincode {
    // Actually cb.normalKey is taken as an input from outside
    cb.normalKey = [](unsigned char c){std::cout << c << std::endl;} ;
    // this was just to lake the code work
    defineCallback(proxy);
}

defineCallback 在别处定义:

void defineCallback(void (*func)(unsigned char))
{
    *func("hello world");
    //should be : glutKeyboardFunc(func);
}

这可行,但自动对焦很丑。但是,因为函数指针来自静态函数,所以除了用extern我没有找到其他方法。

我环顾四周,但从未找到解决这个确切问题的方法。有什么让它更干净的建议吗?

非常感谢!

为清楚起见:我不能改变我需要提供一个函数指针给defineCallback的事实,也不能从外部接收std::function。

我认为这永远不会 super-neat 整洁。如果是我,我可能会使用 inline 函数,以便它们可以进入 头文件 并且我会使用 thread_local 存储来增加一点线程安全性。

有点像这样:

// force the compiler to make sure only one of these functions
// is linked and this can go in the header file
inline std::function<void(unsigned char)>& get_std_function()
{
    // returns a different object for each thread that calls it
    static thread_local std::function<void(unsigned char)> fn;
    return fn;
}

inline void proxy(unsigned char c){ get_std_function()(c); };

void maincode() {
    // Actually cb.normalKey is taken as an input from outside
    get_std_function() = [](unsigned char c){std::cout << c << std::endl;} ;

    // this was just to lake the code work
    defineCallback(proxy);
}