I have the following problem:
template< typename callable, typename T , size_t... N_i>
void foo()
{
using callable_out_type = std::result_of_t< callable( /* T , ... , T <- sizeof...(N_i) many */ ) >;
// ...
}
I want to get the result type of callable
which takes sizeof...(N_i)
many arguments of the type T
as its input, e.g., callable(1,2,3)
in case of T==int
and sizeof...(N_i)==3
. How can this be implemented?
Many thanks in advance.
We can use a type alias to hook onto the expansion of N_i
, but always give back T
.
template <class T, std::size_t>
using eat_int = T;
template< typename callable, typename T , size_t... N_i>
void foo()
{
using callable_out_type = std::result_of_t< callable(eat_int<T, N_i>...) >;
// ...
}
Why not simply use:
using callable_out_type = std::result_of_t< callable( decltype(N_i, std::declval<T>())...) >;
you could also use a trick borrowed from Columbo's answer:
using callable_out_type = std::result_of_t< callable(std::tuple_element_t<(N_i, 0), std::tuple<T>>...) >;
or even:
using callable_out_type = std::result_of_t< callable(std::enable_if_t<(N_i, true), T>...) >;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With