我看到gcc,clang和msvc 2015/2017之间存在一些不一致之处。以下命令在msvc上失败,但不是gcc或clang。这些元函数应该返回函数签名类型中的参数类型:
template <int _ParamNum, typename _Ty> struct _get_parameter;
template <typename _ReturnT, typename _HeadT, typename ... _TailT>
struct _get_parameter<0, _ReturnT(_HeadT, _TailT...)>
{
using type = _HeadT;
};
template <int _ParamNum, typename _ReturnT, typename _HeadT, typename ... _TailT>
struct _get_parameter<_ParamNum, _ReturnT(_HeadT, _TailT...)>
{
using type =
typename _::template _get_parameter<_ParamNum - 1, _ReturnT(_TailT...)>::type;
};
用类似的东西调用:
using param_type = typename _get_parameter<0, decltype(printf)>::type;
我倾向于认为它是一个MSVC错误,但我希望有人能够代之以解决代码的问题。
提前致谢
修改
我的立场得到了纠正:http://rextester.com/XZEL74804这似乎与较大的代码库有一些奇怪的互动。