我们如何完美地转发lambda并将其存储到具有固定签名的给定函数对象? lambda实际上是由用户定义的,可以返回整数或不返回任意数量的参数。如果给定的lambda没有返回,则包装器应该返回一个默认值(比如-1),或者简单地从lambda返回它。
std::function<int()> func;
auto L1 = [](char joe) {
return 1;
}
auto L2 = [](char joe, float num) {
// no return
}
使用上面的例子,我相信可变参数模板可以提供帮助。
template <
typename C, typename... T, typename R = std::result_of_t<C(T...)>,
std::enable_if_t<std::is_same_v<void, R> *= nullptr >
>
auto make_function(C&& c, T&&... args) {
return [&]() { c(args...); return -1; }
}
template <
typename C, typename... T, typename R = std::result_of_t<C(T...)>,
std::enable_if_t<std::is_same_v<int, R> *= nullptr >
>
auto make_function(C&& c, T&&... args) {
return [&]() { return c(args...); }
}
我可能需要这样的东西:
func = make_function(L1, 'a');
func = make_function(L2, 'b', 1.2f);
我不知道实施这样的事情是否可行。任何帮助将不胜感激。