我有这样的功能:
template <typename P1, typename... Ps> constexpr auto pipe(P1 &&proc1,
Ps &&...procs) -> Cont<Cont<
Proc<typename RevProc<P1>::ArgType,
typename RevProc<typename Last<Ps...>::Type>::RetType>>> {
using T = typename RevProc<P1>::ArgType;
using U = typename RevProc<P1>::RetType;
using V = typename RevProc<typename Last<Ps...>::Type>::RetType;
return [&] (Cont<Proc<T, V>> &&pass) {
pipe(move(procs)...)([&] (Proc<U, V> &&proc2) {
pipe(move(proc1), move(proc2))(move(pass));
});
};
}
您可能会发现类型声明是重复的。是否有机会为此功能提供如下签名:
template <typename P1, typename... Ps> constexpr auto pipe(P1 &&proc1,
Ps &&...procs) -> Cont<Cont<Proc<T, V>>>
并在适当的位置定义T
和V
?
答案 0 :(得分:0)
在C ++ 14中,您可以推断出类型:
std::move
顺便说一句,你对pipe
的一些使用看起来并不合法,因为 return Cont<Cont<Proc<T, V>>>([&](Cont<Proc<T, V>> &&pass) {
pipe(std::forward<Ps>(procs)...)([&](Proc<U, V> &&proc2) {
pipe(std::forward<P1>(proc1), std::move(proc2))(std::move(pass));
});
});
可能会被调用者不希望被移动的左值调用。最好通过转发参考来实际转发你所做的事情:
static double MeanAngle(List<double> angles)
{
double x = 0, y = 0;
foreach (double angle in angles)
{
x += Math.Cos(angle);
y += Math.Sin(angle);
}
return Math.Atan2(y / angles.Count, x / angles.Count);
}