Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板化lambdas中的Static关键字_C++_Templates_C++11_Lambda_C++14 - Fatal编程技术网

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!