具有显式参数和大小的可变参数模板.Visual Studio 2013.

Variadic template with explicit arguments and sizeof... Visual Studio 2013

本文关键字:参数 变参 Visual 2013 Studio      更新时间:2023-10-16

我试图枚举一个可变参数元组,以便我可以对其每个元素执行某些操作。

#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中编译得很好。 谁能解释一下为什么大小...(Args) 被推导出为 1,即使传递了具有 3 个参数的元组? 另外,为什么这是VS2013中的错误,而不是VS2015中的错误?

注意:我通过向后枚举元组(从末尾开始)构建了一个解决方法(对于VS2013)

谁能解释一下为什么大小...(Args) 被推导出为 1,即使传递了具有 3 个参数的元组?

我不能。

也许是编译器错误?

还是 C++11 支持不足?

另外,为什么这是VS2013中的错误,而不是VS2015中的错误?

我不明白VS2015如何编译您的代码,因为存在错误:您的print()printTuple()函数正在接收非常量的l值引用,但您在main()中调用printTuple()

printTuples(std::make_tuple(1, 2.,3.));

具有 R 值(与非常量 L 值引用不兼容)。

建议:修改函数以接收常量l 值引用

template <std::size_t N, typename ...Args>
typename std::enable_if<N == sizeof...(Args)>::type
print (std::tuple<Args...> const & tuples)
{ } // ......................^^^^^
template <std::size_t N, typename ...Args>
typename std::enable_if<(N < sizeof...(Args))>::type
print (std::tuple<Args...> const & tuples)
{ // ........................^^^^^
std::cout << std::get<N>(tuples);
print<N + 1u>(tuples);
}
template <typename ...Args>
void printTuples (std::tuple<Args...> const & tuples)
{ print<0u>(tuples); } // ...........^^^^^