Здравствуйте, Went, Вы писали:
W>Запустить "как есть" его не получится (call_traits и call_elements), но, может, будут какие-то замечания просто при взгляде на него?
Вот тебе еще один вариант. В точности в твоей постановке, но гораздо проще в реализации, без туплов и всяких мета-чудес:
http://coliru.stacked-crooked.com/a/3f41b4c768c465c2
#include <iostream>
#include <functional>
namespace md {
void add_to_queue(const std::function<void()>& fnc)
{
fnc(); // Для проверки просто вызываем
}
template<typename F>
struct defer_proxy
{
template<typename... Args>
void operator()(Args&&... args) const
{
auto&& fn_ = fn;
add_to_queue([=](){fn_(args...);}); // call_elements = std::apply
}
F fn;
};
template<typename F>
defer_proxy<F> defer(const F& fn)
{
return {fn};
}
} // md
int main(int argc, char * argv[])
{
auto x = [](int i, float f)
{
std::cout << i << " " << f << std::endl;
};
md::defer(x)(1, 1.0f);
std::function<void(int, float)> y = x;
md::defer(y)(2, 2.0f);
}