我正在尝试编写可使我索引到函数的参数类型的代码:

template <typename R, typename... ARGS>
R function_return(R(*)(ARGS...));

template <typename R, typename... ARGS>
std::tuple<ARGS...> function_parameters(R(*)(ARGS...));

template <int I, typename T>
using get_type = typename std::conditional_t<(I < 0), std::tuple_element<static_cast<int>(std::tuple_size_v<T>) + I, T>, std::tuple_element<I, T>>::type;

template <int I, typename T>
using parameter_type = get_type<I, decltype(function_parameters(std::declval<T>()))>;




但是,当我尝试在visual-studio-2017上使用它时,出现内部编译器错误:



我还有另一种方法可以解决内部编译器错误吗?

最佳答案

这可能取决于VS2017的确切(子)版本,因为我的代码未生成ICE。但是,该代码仍然存在问题,因为它可能会实例化std::tuple_element<2147483647, T>或类似的东西。您需要确保只评估了正确的分支。用以下内容替换您对get_type的定义:

template <int I, typename T, bool negative = (I < 0)>
struct get_type_impl;

template <int I, typename T>
struct get_type_impl<I, T, true>
{
  using type = typename std::tuple_element<static_cast<int>(std::tuple_size<T>::value) + I, T>::type;
};

template <int I, typename T>
struct get_type_impl<I, T, false>
{
  using type = typename std::tuple_element<I, T>::type;
};

template <int I, typename T>
using get_type = typename get_type_impl<I, T>::type;

这适用于我的VS 2017(cl版本19.12)

09-08 09:31