Aplicando uma função a cada elemento de uma tupla
Dado umstd::tuple
objeto semelhante (ou seja, comtuple_size
eget
semântica) e um objeto de função unárioftor
, Eu quero poder ligarftor
em cada elemento dotuple
objeto parecido.
Se desconsiderar o valor de retorno, conheço o truque da matriz 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> {});
}
Se eu quiser os valores de retorno, eu poderia substituir oint []
truque com uma chamada parastd::make_tuple
em vez disso e devolva isso. Isso funcionaria desde que nenhuma das chamadas para oftor
objeto tem umvoid
valor de retorno...
A pergunta que tenho é, portanto: considerando que quero obter os resultados da chamada, como posso lidar com as chamadas que podem retornarvoid
?
O único requisito é que eu obtenha os resultados como uma tupla e seja capaz de dizer qual chamada leva a qual elemento da referida tupla de resultado.