определение размера последовательности с использованием общего интерфейса - PullRequest
0 голосов
/ 19 февраля 2012

Я хочу определить размер последовательности. Для всех последовательностей в 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
}

По сути, я ищу функцию размера, не являющегося членом, точно так же, как у нас есть нечлены begin () и end () в C ++ 11

PS: под последовательностью я подразумеваю последовательность, определенную в STL (все они имеют функцию-член .size ()), включая массивы в качестве аргумента.

Ответы [ 3 ]

3 голосов
/ 19 февраля 2012

Вы можете сделать это, перегрузив функцию 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(); 
}

Обратите внимание, что это не будет работать для массивов, которые разложены в указатели.Кроме того, я всегда рекомендовал бы использовать std::array над массивами в стиле C, если только вы не работаете с библиотекой C.

1 голос
/ 19 февраля 2012

Вы не очень подробно объяснили, что такое (а что нет) последовательность, но если она похожа по концепции и исполнению на Boost.Range, то, возможно, boost::size представляет интерес длявы.

1 голос
/ 19 февраля 2012

вы могли бы использовать что-то следующее:

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

, хотя я не утверждаю, что это эффективно в любом случае.Получение размера последовательности не зависит от этой последовательности (например, нахождение размера связанного списка принципиально отличается от нахождения размера вектора), и оно будет более эффективным, как это предполагает dauphic, предоставляя перегрузки для каждогоопределенный тип последовательности, который не реализует .size

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...