从外部获取函数指针的简洁方法 std::function
Clean way to get function pointer from external std::function
因为 C,我需要一个 函数指针 来自我在运行时收到的 std::function。
让我们调用 defineProxyCallback 以 unsigned 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);
}
因为 C,我需要一个 函数指针 来自我在运行时收到的 std::function。
让我们调用 defineProxyCallback 以 unsigned 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);
}