在编译时生成类型为T的序列

时间:2016-10-26 17:30:56

标签: c++ c++14 callable

我有以下问题:

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 */ ) >;

  // ...
}

我希望获得结果类型callable,其中sizeof...(N_i)类型T的许多参数作为输入,例如callable(1,2,3) T==int }和sizeof...(N_i)==3。如何实施?

非常感谢提前。

3 个答案:

答案 0 :(得分:12)

我们可以使用类型别名来挂钩N_i的扩展,但始终返回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>...) >;

  // ...
}

答案 1 :(得分:6)

为什么不简单地使用:

using callable_out_type = std::result_of_t< callable( decltype(N_i, std::declval<T>())...) >;

您还可以使用从Columbo's answer借来的技巧:

using callable_out_type =  std::result_of_t< callable(std::tuple_element_t<(N_i, 0), std::tuple<T>>...) >;

甚至:

using callable_out_type =  std::result_of_t< callable(std::enable_if_t<(N_i, true), T>...) >;

答案 2 :(得分:5)

您可以编写以下帮助

template<typename T, size_t>
using type_t = T;

template<typename Callable, typename T, size_t... Is>
auto get_result_of(std::index_sequence<Is...>) -> std::result_of_t<Callable(type_t<T,Is>...)>;

template<typename Callable, typename T, size_t N>
using result_of_n_elements = decltype(get_result_of<Callable, T>(std::make_index_sequence<N>{}));

然后在你的foo中写下

template< typename callable, typename T , size_t N>
void foo()
{
    using callable_out_type = result_of_n_elements<callable, T, N>;
}

live demo