在下面的模板函数定义中,我写了两次比较长的表达式details::transform(std::forward<T>(t))
其中 t
是一个参数包。
我该如何分解它?
auto pack = details::transform(std::forward<T>(t))
当然不行。
template<class ...T>
void f(T&&... t)
{
auto check = (details::transform(std::forward<T>(t)) && ...);
if (check == false) {
return;
}
details::act(details::transform(std::forward<T>(t))...);
}
出于测试目的,这里有一个 complete program on coliru .
最佳答案
C++ 有一个可悲的事实。转发可以成为一簇 token 。而且需要转发的表达越复杂,就越痛苦。
可悲的是,我所知道的唯一减轻它的方法是使用预处理器......
#define FWD(...) std::forward<decltype(__VA_ARGS__)>(__VA_ARGS__)
有了它,我们可以重构您的函数以使用 IILE 仅生成一次该包:
template<class ...T>
void f(T&&... t)
{
[](auto&&... pack) {
auto check = (FWD(pack) && ...);
if (check == false) {
return;
}
details::act(FWD(pack)...);
}(details::transform(FWD(t))...);
}
那样的话,每个参数你只需要调用一次transform
。我认为这是最终目标。否则,您可能可以使用预处理器在没有 lambda 的情况下生成更简单的东西。
关于c++ - 分解模板参数包操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51949542/