gpt4 book ai didi

c++ - 具有显式参数和 sizeof 的 Variadic 模板... Visual Studio 2013

转载 作者:太空狗 更新时间:2023-10-29 22:54:27 25 4
gpt4 key购买 nike

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

#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)

最佳答案

Could anyone please explain me why sizeof...(Args) was deduced to 1, even though a tuple with 3 arguments have been passed?

我不能。

可能是编译器错误?

还是对 C++11 的支持不足?

Also why is this an error in VS2013 and not on VS2015?

我不明白 VS2015 如何编译你的代码,因为有一个错误:你的 print()printTuple() 函数正在接收一个 not -const 左值引用,但您在 main()

中调用了 printTuple()
printTuples(std::make_tuple(1, 2.,3.));

具有右值(与非 const 左值引用不兼容)。

建议:修改您的函数以接收const 左值引用

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); } // ...........^^^^^

关于c++ - 具有显式参数和 sizeof 的 Variadic 模板... Visual Studio 2013,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55934868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com