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>>>
并在适当的位置定义T
和V
?
在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));
});
});
我有这样的功能:
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
?
在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));
});
});