解决带有嵌套模板变量的Visual Studio内部编译器错误

Jon*_*Mee 5 c++ function-parameter internal-compiler-error template-variables visual-studio-2017

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

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>()))>;
Run Code Online (Sandbox Code Playgroud)

Live Example (ICE under VS) Live Example (working on GCC)

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

严重错误C1001:编译器中发生内部错误。

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

Jon*_*Mee 1

正如这里提到的似乎在相互传递模板化的 using 语句方面遇到了困难。(我在 15.6.7 上看到内部编译器错误;正如此处提到的,这可能已通过补丁修复。)

我已经能够通过在单个 using 语句中捕获所有功能来解决这个问题:

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, typename X = decltype(function_parameters(std::declval<T>()))>
using parameter_type = typename std::conditional_t<(I < 0), std::tuple_element<static_cast<int>(std::tuple_size_v<X>) + I, X>, std::tuple_element<I, X>>::type;
Run Code Online (Sandbox Code Playgroud)