c++ - 具有显式参数和大小的可变参数模板... Visual Studio 2013
问题描述
我试图枚举一个可变参数元组,以便我可以对其每个元素执行某些操作。
#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)
解决方案
谁能解释一下为什么 sizeof...(Args) 被推导出为 1,即使已经传递了一个具有 3 个参数的元组?
我不能。
也许是编译器错误?
还是 C++11 支持不足?
另外为什么这是 VS2013 中的错误而不是 VS2015 中的错误?
我不明白 VS2015 如何编译您的代码,因为出现错误:您的print()
和printTuple()
函数正在接收非 constprintTuple()
左值引用,但您调用main()
printTuples(std::make_tuple(1, 2.,3.));
具有 r 值(与非 const 左值引用不兼容)。
建议:修改您的函数以接收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); } // ...........^^^^^
推荐阅读
- javascript - 什么正则表达式匹配所有国际手机号码
- teradata - 提取特定日期时间范围的数据#Teradata
- python - Python3:操作系统捕获读取/写入文件
- javascript - 用于隐藏元素的事件监听器
- php - Laravel:外键格式错误
- node.js - 如何使用节点打开记事本
- angular - 忽略 Visual Studio 代码上的特定 tslint 错误
- c# - 如何在选择 TextBlock 中的文本的位置显示浮出控件
- python - 如何保存使用 matplolib 1.5 绘制的图像
- ros - 如何将 Webots 时间与 ROS 时间同步?