【发布时间】:2019-05-01 10:33:56
【问题描述】:
我试图枚举一个可变元组,以便我可以对其每个元素执行某些操作。
#include <iostream>
#include <tuple>
#include <utility>
template <size_t N, typename ...Args>
typename std::enable_if<N == sizeof...(Args), void>::type
print(std::tuple<Args...> const& tuples)
{ }
template <size_t N, typename ...Args>
typename std::enable_if<(N < sizeof...(Args)), void>::type
print(std::tuple<Args...> const& tuples)
{
std::cout << std::get<N>(tuples);
print<N + 1>(tuples);
}
template <typename ...Args>
void printTuples(std::tuple<Args...> const& tuples)
{
print<0>(tuples);
}
int main(int argc, char** argv)
{
printTuples(std::make_tuple(1, 2.,3.));
return 0;
}
在 Visual Studio 2013 中,这会导致以下错误:
1>main.cpp(15): error C2770: invalid explicit template argument(s) for 'std::enable_if<N<1,void>::type print(std::tuple<_Types1...> &)'
1>main.cpp(15): error C2893: Failed to specialize function template 'std::enable_if<N==1,void>::type print(std::tuple<_Types1...> &)'
这在 VS2015 中编译得很好。 谁能解释一下为什么 sizeof...(Args) 被推导出为 1,即使已经传递了一个具有 3 个参数的元组? 还有为什么这是 VS2013 中的错误,而不是 VS2015 中的错误?
注意:我通过向后枚举元组(从末尾开始)构建了一个解决方法(针对 VS2013)
【问题讨论】:
标签: c++ c++11 visual-studio-2015 visual-studio-2013 variadic-templates