将函数应用于元组的每个元素

Rer*_*ito 9 c++ tuples c++14

给定一个std::tuple样对象(即,具有所定义tuple_size和get语义)和一元函子对象ftor,我想能够调用ftor所述的各元件上tuple样的对象.

如果我忽略返回值,我知道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> {});
}
Run Code Online (Sandbox Code Playgroud)

如果我想要返回值,我可以用int []调用替换该技巧, std::make_tuple然后返回.如果没有对该ftor对象的调用具有void返回值,那将是有效的...

因此我的问题是:考虑到我想得到调用的结果,我该如何处理可能返回的调用void?

唯一的要求是我应该将结果作为元组得出,并且能够告诉哪个调用导致所述结果的哪个元素元组.

Max*_*kin 2

其他方式:

namespace details {

struct apply_unary_helper_t {};

template<class T> 
T&& operator,(T&& t, apply_unary_helper_t) { // Keep the non-void result.
    return std::forward<T>(t); 
}

template <typename Ftor, typename Tuple, size_t... Is>
void apply_unary(Ftor&& ftor, Tuple&& tuple, std::index_sequence<Is...>) {
    auto r = {(ftor(std::get<Is>(std::forward<Tuple>(tuple))), apply_unary_helper_t{})...};
    static_cast<void>(r); // Suppress unused variable warning.
}

} // 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<std::remove_reference_t<Tuple>>::value> {});
}
Run Code Online (Sandbox Code Playgroud)

在上面,它适用于和operator,的结果。如果 的结果是,则是,否则是 ,您可以使用它。ftorapply_unary_helper_tftorvoidrstd::initializer_list<details::apply_unary_helper_t>rstd::initializer_list<decltype(ftor(...))>