使用公共接口查找序列的大小
finding size of a sequence using a common interface
我想确定序列的大小。对于STL中的所有序列,我可以使用.size()成员函数,但如果序列是数组,我会遇到麻烦。如何通过编程确定作为参数传递的序列是数组类型还是STL序列类型。
例如
template<typename sequence>
size_t find_size(sequence& s)
{
// if s has .size() member function
// return s.size()
//else if it is an array type
// return sizeof(s)
//else throw error
}
基本上,我正在寻找一个非成员大小函数,就像我们在C++11中有非成员begin()和end()一样
PS:我所说的序列是指STL中定义的序列(所有序列都有一个.size()成员函数),包括作为参数的数组。
您可以通过重载数组的find_size
函数来实现这一点。
// This overload expects an array to be passed by reference.
template<typename T, size_t N>
size_t find_size(T (&)[N]) {
return N;
}
// This overload takes any other type that supports T::size().
template<typename T>
size_t find_size(T c) {
return c.size();
}
请注意,这对于已经降级为指针的数组是不起作用的。此外,我总是建议在C样式数组上使用std::array
,除非您使用的是C库。
您可以使用以下内容:
template<typename T>
size_t find_size(const T& c)
{
return distance(begin(c), end(c));
}
尽管我并不声称它在任何方面都是有效的。获取序列的大小并不独立于该序列(例如,查找链表的大小与查找向量的大小根本不同),并且它将更有效,正如daupic所建议的那样,为未实现的每种特定类型的序列提供重载。size
您还没有真正详细解释什么是(什么不是)序列,但如果它在概念和执行上与Boost.Range相似,那么您可能会对boost::size
感兴趣。
相关文章:
- 正在查找文档以获得PS4平台的C++中的设备信息
- 在C++中查找文件
- 模板元程序查找相似的连续类型名称
- 在UNIX系统中使用DIR查找文件的字节大小
- 查找最接近的大于当前数字的数字的索引
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 查找后更改类变量
- 使用正则表达式regex_search在字符串中查找字符串
- 使用gcc从静态链接的文件中查找可选符号
- 在C++中查找范围的长度
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 算法问题:查找从堆栈中弹出的所有序列
- Visual C++GC接口如何启用它以及要包含哪个库
- C/C++:POSIX 兼容方式查找默认网络接口上/下
- 如何在 Linux 的 cpp 中查找侦听 0.0.0.0 的服务器的网络接口
- 使用接口类型查找子窗口小部件
- 使用公共接口查找序列的大小
- 查找C/ c++中可用的网络接口
- 查找/下载头文件R.h和Rmath,用于C与R接口
- 查询接口以查找具有 libpcap 的设备