作者:手机用户2602901335 | 来源:互联网 | 2022-12-01 13:37
我想打一个方法convert
,需要一个通用的函数bar
(可以是std::function
,lambda
,functor
,...),并将其转换为一个std::function)>
.该功能bar
可以是:
一个函数std::array
作为一个参数并返回一个double
.在这种情况下,convert
写起来并不难:
码:
template
std::function)> convert (F& bar)
{
std::function)> bar_cOnverted= bar;
return bar_converted;
}
一个函数以三个独立的doubles
为参数并返回一个double
.同样在这种情况下,convert
写起来并不困难:
码:
template
std::function)> convert(F& bar)
{
std::function)> bar_converted;
auto array_bar = [bar]( std::array x)->double{ return bar(x[0], x[1], x[2]); };
bar_cOnverted= array_bar;
return bar_converted;
}
问题是我不知道如何将这两种convert
方法结合起来,或者这是否可能?
1> Barry..:
我将从如何在C++ 17中编写它开始:
template
std::function)> convert(F&& f) // <== NB: forwarding ref
{
if constexpr (std::is_invocable_v) {
// direct case
return std::forward(f);
} else {
// unpacking case
return [f=std::forward(f)](std::array arr) {
return std::apply(f, arr);
};
}
}
在C++ 14,你没有 if constexpr
,is_invocable
或者apply
.第一个可以通过执行标记调度来实现(你可以使用std::true_type
或者调用一个辅助函数std::false_type
)而另外两个可以在C++ 14中实现就好了,并且它们是非常有用的辅助函数,你可能需要许多其他函数事情无论如何.