使用公共接口查找序列的大小

finding size of a sequence using a common interface

本文关键字:查找 接口      更新时间:2023-10-16

我想确定序列的大小。对于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感兴趣。