2012-02-18 30 views
0

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

PS非成员尺寸功能,正如我们有非会员begin()和结束():由序列我指的是序列在STL中定义(它们都有.size()成员函数),包括数组作为参数。

回答

3

您可以通过为数组重载您的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库。

+0

实际上,我想拥有这样一个接口,以便它独立于任何序列类型。 – 2012-02-19 00:27:49

+0

我不确定你在问什么。你只想使用一个函数而不是两个来获得相同的结果? – 2012-02-19 00:28:43

+0

重载函数也很好。 – 2012-02-19 00:33:08

1

,你可以使用的东西如下:

template<typename T> 
size_t find_size(const T& c) 
{ 
    return distance(begin(c), end(c)); 
} 

虽然我并不认为这是在任何方面有效。获取序列的大小并不依赖于该序列(例如,查找链接列表的大小与查找矢量的大小根本不同),并且它会更有效,因为通过为每个链接提供重载提示dauphic没有实现的特定类型的序列.size

1

你没有详细解释过什么是(和不是什么)序列,但是如果它在概念和执行上与Boost.Range类似,那么boost::size可能是对你感兴趣。