C++ 中函数参数的类型别名

Type alias for function arguments in C++

我有这样的功能:

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?

在C++14中,你可以只推导类型:

template <typename P1, typename... Ps>
constexpr auto pipe(P1 &&proc1, Ps &&...procs) {
  using T = typename RevProc<P1>::ArgType;
  using U = typename RevProc<P1>::RetType;
  using V = typename RevProc<typename Last<Ps...>::Type>::RetType;
  return Cont<Cont<Proc<T, V>>>([&](Cont<Proc<T, V>> &&pass) {
    pipe(std::move(procs)...)([&](Proc<U, V> &&proc2) {
      pipe(std::move(proc1), std::move(proc2))(std::move(pass));
    });
  });
}

顺便说一下,您对 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));
    });
  });