所以,我有以下用例。基本上:我使用模板在签名duk_ret_t(*)(duk_context*)
的函数中包装任何签名的函数。但是,如果我尝试使用相同的签名包装多个函数,我遇到了一个问题:返回的lambda是相同的 - 它们的指针所指向的地址是相同的。这是我的DukFunction类,它生成Lambda:
class DukFunction
{
public:
DukFunction(std::string name_item)
{
m_Name = name_item;
}
template<typename T_Return, typename ... T_Params>
void bindFunction(T_Return(*function_item)(T_Params ...))
{
std::function<T_Return(T_Params ...)> proxy_func(function_item);
duk_c_function lmb = [] (duk_context* ctx) -> duk_ret_t {
static bool function_ran_already = false;
static std::function<T_Return(T_Params ...)> function_item = *((std::function<T_Return(T_Params ...)>*)detail::duk_function_data);
if(function_ran_already)
{
std::cout << "i ran!" << std::endl;
return 0;
}
else if (function_ran_already == 0)
{
detail::duk_function_data = NULL;
function_ran_already = true;
}
};
rubberduk::detail::duk_function_data = (void*)&proxy_func;
lmb(NULL);
m_Function = duk_function_t(lmb);
}
...
}
在这里,在main.cpp
我使用DukFunction类来绑定相同签名的2个函数。
int printSomething(int arg1, std::string arg2)
{
return 101;
}
int printSomething2(int arg1, std::string arg2)
{
unsigned int eeg = arg1;
return 432 + arg1;
}
int main(int argc, char** argv)
{
rubberduk::DukFunction df("c_print");
rubberduk::DukFunction df2("c_print2");
df.bindFunction(printSomething);
df2.bindFunction(printSomething2);
duk_c_function x = *df.getFunction().target<duk_ret_t(*)(duk_context*)>();
std::cout << (void*)x << std::endl;
x(NULL);
duk_c_function x2 = *df2.getFunction().target<duk_ret_t(*)(duk_context*)>();
std::cout << (void*)x2 << std::endl;
x2(NULL);
return 0;
}
正如我所说,我得到以下结果:
i ran!
0x4f4cc0
i ran!
0x4f4cc0
i ran!
可以清楚地看到,返回lambda的地址是相同的。我猜测这是因为lambda是生成编译时(?),而C ++显然只为两种情况生成一次bindFunction模板,因为它们共享相同的模板参数。谁能给我一个明确的答案? 有没有解决方法,所以我可以实现我想要实现的目标(见上文)? 在此先感谢,我真的拼命寻找解决问题的方法,但我似乎无法找到一个......