【发布时间】:2015-07-13 19:07:04
【问题描述】:
从这里得到答案:iterate over tuple 关于打印std::tuple 组件,这里是代码:
template<std::size_t I = 0, typename... Tp>
typename std::enable_if<I == sizeof...(Tp), void>::type
print(const std::tuple<Tp...>& t)
{ }
template<std::size_t I = 0, typename... Tp>
typename std::enable_if<I < sizeof...(Tp), void>::type
print(const std::tuple<Tp...>& t)
{
std::cout << std::get<I>(t) << std::endl;
print <i, Tp...> (t);
}
这可以在 GCC 上完美编译和运行,但无法在 VC++ 上编译(我使用 Visual Studio 2013)。我得到的错误:
Error 4 error C2893: Failed to specialize function template 'std::enable_if<I==1,void>::type print(const std::tuple<_Types1...> &)'
Error 3 error C2770: invalid explicit template argument(s) for 'std::enable_if<I<1,void>::type print(const std::tuple<_Types1...> &)'
显然,当使用带有显式模板参数的std::enable_if 时,C2770 上有一个已记录的错误。一些开发人员建议使用const int 作为模板的预参数
const int i = I+1;
print<i,Tp...>(t);
但这也不起作用。
还有其他解决方案,例如使用一些宏,但它们也失败了。
有人可以解决它吗?我搜索了一个解决方案,但没有找到真正有效的解决方案。
谢谢。
【问题讨论】:
-
在 VS2015 RC 中为我工作。发布(希望)很快,因此工具链升级可能是非标准的,但也是可行的选择。 (VS2015更不用说
constexpr,更快的编译和链接等) -
感谢他们修复了它 :)
标签: c++ c++11 visual-studio-2012 visual-c++ visual-studio-2013