C++ 模板化lambdas中的Static关键字
因此,我有以下用例。基本上:我使用模板将任何签名的函数包装到一个签名为C++ 模板化lambdas中的Static关键字,c++,templates,c++11,lambda,c++14,C++,Templates,C++11,Lambda,C++14,因此,我有以下用例。基本上:我使用模板将任何签名的函数包装到一个签名为duk\u ret\u t(*)(duk\u context*)的函数中。但是,如果我尝试用相同的签名包装多个函数,我会遇到一个问题:返回的lambda是相同的,它们的指针指向的地址是相同的。这是我的DukFunction类,它生成Lambda: class DukFunction { public: DukFunction(std::string name_item) { m_Name = n
duk\u ret\u t(*)(duk\u 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);
}
...
}
正如我所说,我得到了以下结果:
i ran!
0x4f4cc0
i ran!
0x4f4cc0
i ran!
可以清楚地看到,返回lambda的地址是相同的。IM猜测这是因为lambdas是生成编译时间(?),C++显然只为两种情况生成一次BIDENTUM模板,因为它们共享相同的模板参数。谁能给我一个明确的答案?
是否有任何解决方法,以便我能够实现我想要实现的目标(见上文)?
提前感谢,我真的在拼命寻找我的问题的解决方案,但我似乎找不到一个…简单地说,如果不止一个TU看到了
DukFunction的定义,那么这就是ODR违反,所以任何答案都是对UB行为的推测。@ildjarn对不起,什么?你在使用lambdas,每个TU在内联函数中都是唯一的。如果这些内联函数被编译成多个TU,那么就会出现ODR冲突,从而导致UB。看@ildjarn哦,完全监督这件事。我想你是对的。在这种情况下,我可以只使用模板函数,而不是lambda。你对我的问题有什么解决办法或提示吗?请选民解释一下好吗?!
i ran!
0x4f4cc0
i ran!
0x4f4cc0
i ran!