【发布时间】:2017-11-07 09:11:54
【问题描述】:
给定一个类似std::tuple 的对象(即定义了tuple_size 和get 语义)和一个一元函子对象ftor,我希望能够在@987654328 的每个元素上调用ftor @-like 对象。
如果我忽略返回值,我知道 int 数组技巧:
namespace details {
template <typename Ftor, typename Tuple, size_t... Is>
void apply_unary(Ftor&& ftor, Tuple&& tuple, std::index_sequence<Is...>) {
using std::get;
int arr[] = { (ftor(get<Is>(std::forward<Tuple>(tuple))), void(), 0)... };
}
} // namespace details
template <typename Ftor, typename Tuple>
void apply_unary(Ftor&& ftor, Tuple&& tuple) {
details::apply_unary(std::forward<Ftor>(ftor),
std::forward<Tuple>(tuple),
std::make_index_sequence<std::tuple_size<Tuple>::value> {});
}
如果我想要返回值,我可以将 int [] 技巧替换为对 std::make_tuple 的调用并返回它。如果对ftor 对象的调用都没有void 返回值,那么这将起作用...
因此,我的问题是:考虑到我想获得调用的结果,我该如何处理可能返回 void 的调用?
唯一的要求是我应该以元组的形式获得结果,并且能够判断哪个调用导致所述结果元组的哪个元素。
【问题讨论】:
-
I threw something together 使用 Boost Hana 基本上使用
hana::tuple完成此操作,但我认为它不太值得回答。只是在这里发布,以防有人想将其改编为答案 -
您可以构建一个映射模板,在元组项索引和结果元组项索引之间进行映射。
-
将仿函数调用包装在一个函数中,该函数在 void 情况下返回 dummy struct 而不是 void
-
@lorro 不是这样,在您链接的问题中,返回值被丢弃。如果有的话,您链接的问题可以被视为我的问题的子案例