在C ++中键入函数参数的别名

时间:2017-10-26 23:16:06

标签: c++ c++11 refactoring using type-alias

我有这样的功能:

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>>>

并在适当的位置定义TV

1 个答案:

答案 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);
}