接受任何类型的STL容器并使用其值类型
Accepting any type of STL container and using its value type
我有一个函数,它对任意类型的STL容器进行操作,并且需要将容器的元素类型传递给另一个模板函数。实际上,当我说任何容器类型时,我并不是指它。严格来说只有向量和数组。像这样:
template <typename T> int ProcessData(T data)
{
return DoInternalProcessing<T::value_type>(data.data(), data.size());
}
MSVC11接受此代码,但gcc不接受。有什么问题吗?对于gcc,我也考虑过将值类型作为参数,但这将要求调用者指定T(容器类型),这对于std::array来说是非常笨拙的,这个函数的主要目的是提供一个非常简单的接口,从底层数据中抽象出来。
由于T::value_type
是依赖类型,因此需要typename T::value_type
。
这对数组不起作用——数组不会像vector
那样提供value_type
的类型定义。
通常的处理方法是接受一对迭代器(或指针,如果底层的"集合"是数组)。在这种情况下,可以使用std::iterator_traits<T>::value_type
来获取迭代器所指向的值类型。这将适用于原始指针,因此(例如)std::iterator_traits<int *>::value_type
将生成int
。
如果您确实必须使用容器(并支持数组),则可以使用std::begin(data)
获取数据开头的迭代器,然后在其上使用std::iterator_traits<T>::value_type
获取value_type。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- C++类型特征,以查看是否可以<uint32_t>对类型"K"的任何变量调用"static_cast(k)"
- C++ 将 CIN 值存储到任何类型的数组中
- 是否有任何建议来统一函数类型限定符并简化可恶的函数类型?
- 为什么 std::lerp 不适用于任何已实现所需操作的类型?
- 对任何类型的元素数组进行排序
- 任何种类的分数 在任何类型的订单中
- C++ - 声明指向返回任何类型并获取任意数量参数的函数的指针
- 正则表达式以匹配数字的重复模式,后跟任何类型的分隔符?
- 为什么 c++ 中的 main() 函数不采用除 int 和 void 之外的任何其他返回类型
- 检查模板中 nullptr 的函数指针,了解任何类型的可调用对象
- 如何制作可以接受任何类型的参数的 std::函数和 lambda
- std::map 保存任何值类型
- 为自定义打印调试实现传递任何类型的变量
- MSVC 错误:4 个重载中的任何一个都无法转换所有参数类型
- 我的代码中是否有任何类型的错误,因为它没有给出正确的输出
- 如何在不给它任何类型(如整数)的情况下定义某物?
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 重载运算符:常量与非常量返回类型:任何性能差异
- 通过引用传递自定义类型-任何性能优势