带有显式参数和sizeof的Variadic模板... Visual Studio 2013

问题描述 投票:3回答:1

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

#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
1个回答
1
投票

谁能解释一下为什么sizeof ...(Args)被推断为1,即使有3个参数的元组已经通过了?

我不能。

也许是编译器错误?

或者C ++ 11支持不足?

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

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

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

带有r值(与非常量l值引用不兼容)。

建议:修改函数以接收const l-value引用

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); } // ...........^^^^^
© www.soinside.com 2019 - 2024. All rights reserved.