【问题标题】:Variadic template with explicit arguments and sizeof... Visual Studio 2013具有显式参数和大小的可变参数模板... Visual Studio 2013
【发布时间】: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


    【解决方案1】:

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

    我不能。

    可能是编译器错误?

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

    还有为什么这是 VS2013 中的错误,而不是 VS2015 中的错误?

    我不明白 VS2015 如何编译您的代码,因为出现错误:您的 print()printTuple() 函数正在接收 not-const 左值引用,但您调用 @ 987654323@ in main()

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

    具有 r 值(与非 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); } // ...........^^^^^
    

    【讨论】:

    • 感谢您的回答。你是对的,代码无法编译。我也会更新我的示例代码。
    • @PVRT - 更正后你会得到关于 sizeof...(Args) 评估的错误 1?
    • 是的。还是同样的错误。从您可以看到的问题中发布的第二条错误消息中,编译器正在尝试将 print() 专门用于 N==1。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 2012-01-20
    相关资源
    最近更新 更多