模板化lambda中的静态关键字

时间:2016-02-20 23:53:00

标签: c++ templates c++11 lambda c++14

所以,我有以下用例。基本上:我使用模板在签名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模板,因为它们共享相同的模板参数。谁能给我一个明确的答案? 有没有解决方法,所以我可以实现我想要实现的目标(见上文)? 在此先感谢,我真的拼命寻找解决问题的方法,但我似乎无法找到一个......

0 个答案:

没有答案