#include <type_traits>
#include <memory>
#include <iostream>
template <typename L, typename R, typename... Args>
struct LambdaWrapper {
static void set(const L& lambda) { m_l.reset(new L(lambda)); }
static R callback(Args&& ... args) { return (*m_l)(std::forward<Args>(args)...); }
private:
static std::unique_ptr<L> m_l;
};
template <typename L, typename R, typename... Args>
std::unique_ptr<L> LambdaWrapper<L, R, Args...>::m_l;
template <typename L, typename R, typename... Args>
auto mem_func_to_wrapper(R (L::*)(Args...))
-> LambdaWrapper<L, R, Args...>; // undefined!
template <typename L, typename R, typename... Args>
auto mem_func_to_wrapper(R (L::*)(Args...) const)
-> LambdaWrapper<L, R, Args...>; // undefined!
template <typename L>
auto lambda_to_wrapper(const L&)
-> decltype(mem_func_to_wrapper(&L::operator())); // undefined!
int main() {
std::size_t toBeCaptured = 100;
auto lambda =
[&](std::string& str) -> std::size_t {
return toBeCaptured + str.length();
};
typedef decltype(lambda_to_wrapper(lambda)) CallbackSupportType;
CallbackSupportType::set(lambda);
std::size_t (*pFunc)(std::string&) = &CallbackSupportType::callback;
std::string str("may work?");
std::size_t ret = pFunc(str);
std::cout << "Result: " << ret << std::endl;
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8aW9zdHJlYW0+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgTCwgdHlwZW5hbWUgUiwgdHlwZW5hbWUuLi4gQXJncz4Kc3RydWN0IExhbWJkYVdyYXBwZXIgewogICAgc3RhdGljIHZvaWQgc2V0KGNvbnN0IEwmIGxhbWJkYSkgeyBtX2wucmVzZXQobmV3IEwobGFtYmRhKSk7IH0KICAgIHN0YXRpYyBSIGNhbGxiYWNrKEFyZ3MmJiAuLi4gYXJncykgeyByZXR1cm4gKCptX2wpKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7IH0KCnByaXZhdGU6CiAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEw+IG1fbDsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBMLCB0eXBlbmFtZSBSLCB0eXBlbmFtZS4uLiBBcmdzPgpzdGQ6OnVuaXF1ZV9wdHI8TD4gTGFtYmRhV3JhcHBlcjxMLCBSLCBBcmdzLi4uPjo6bV9sOwoKdGVtcGxhdGUgPHR5cGVuYW1lIEwsIHR5cGVuYW1lIFIsIHR5cGVuYW1lLi4uIEFyZ3M+CmF1dG8gbWVtX2Z1bmNfdG9fd3JhcHBlcihSIChMOjoqKShBcmdzLi4uKSkKICAtPiBMYW1iZGFXcmFwcGVyPEwsIFIsIEFyZ3MuLi4+OyAvLyB1bmRlZmluZWQhCgp0ZW1wbGF0ZSA8dHlwZW5hbWUgTCwgdHlwZW5hbWUgUiwgdHlwZW5hbWUuLi4gQXJncz4KYXV0byBtZW1fZnVuY190b193cmFwcGVyKFIgKEw6OiopKEFyZ3MuLi4pIGNvbnN0KQogIC0+IExhbWJkYVdyYXBwZXI8TCwgUiwgQXJncy4uLj47IC8vIHVuZGVmaW5lZCEKCnRlbXBsYXRlIDx0eXBlbmFtZSBMPgphdXRvIGxhbWJkYV90b193cmFwcGVyKGNvbnN0IEwmKQogIC0+IGRlY2x0eXBlKG1lbV9mdW5jX3RvX3dyYXBwZXIoJkw6Om9wZXJhdG9yKCkpKTsgLy8gdW5kZWZpbmVkIQoKaW50IG1haW4oKSB7CiAgICBzdGQ6OnNpemVfdCB0b0JlQ2FwdHVyZWQgPSAxMDA7CiAgICBhdXRvIGxhbWJkYSA9CiAgICBbJl0oc3RkOjpzdHJpbmcmIHN0cikgLT4gc3RkOjpzaXplX3QgewogICAgICAgIHJldHVybiB0b0JlQ2FwdHVyZWQgKyBzdHIubGVuZ3RoKCk7CiAgICB9OwogICAgdHlwZWRlZiBkZWNsdHlwZShsYW1iZGFfdG9fd3JhcHBlcihsYW1iZGEpKSBDYWxsYmFja1N1cHBvcnRUeXBlOwogICAgQ2FsbGJhY2tTdXBwb3J0VHlwZTo6c2V0KGxhbWJkYSk7CiAgICBzdGQ6OnNpemVfdCAoKnBGdW5jKShzdGQ6OnN0cmluZyYpID0gJkNhbGxiYWNrU3VwcG9ydFR5cGU6OmNhbGxiYWNrOwogICAgc3RkOjpzdHJpbmcgc3RyKCJtYXkgd29yaz8iKTsKICAgIHN0ZDo6c2l6ZV90IHJldCA9IHBGdW5jKHN0cik7CiAgICBzdGQ6OmNvdXQgPDwgIlJlc3VsdDogIiA8PCByZXQgPDwgc3RkOjplbmRsOwp9