Мне нужен простой способ получить счетчик/длину/размер объекта класса T где T - некоторый тип типа коллекции, такой как std::map, std::list, std::vector, CStringArray, CString, std::string ,...
Для большинства стандартных типов T::size() является правильным ответом, для большинства классов MFC T::GetSize() является правильным, а для CString - T::GetLength().
Я хочу иметь:
template <typename T> auto size(const T & t)
... который вычисляет правильный вызов функции функции.
Кажется, должен быть простой способ вызвать шаблон признаков на T который имеет член size(const T & t), который сам использует SFINAE для существования или не существует, и если он существует, то он по определению вызывает соответствующий t.size_function() чтобы возвращать количество элементов в этом экземпляре T
Я мог бы написать сложный has_member типа has_member - в stackoverflow есть несколько примеров - все они довольно запутаны для того, что мне кажется, "должен быть более простой подход". С C++ 17, похоже, этот вопрос должен быть легко и элегантно решен?
Эти обсуждения здесь и здесь, кажется, используют неэлегантное решение с некоторыми ответами, используя макросы препроцессора, чтобы выполнить эту работу. Это все еще необходимо?
Но... конечно, должен быть способ использовать тот факт, что вызов правильной функции-члена на T компилируется, а вызов неправильного не удается скомпилировать - нельзя ли использовать его непосредственно для создания правильной оболочки типов типов для заданного типа T?
Мне хотелось бы что-то вроде:
template <typename T>
auto size(const T & collection)
{
return collection_traits<T>::count(collection);
}
Если выбрана точная специализация collection_traits<T> потому что она единственная, которая подходит для T (т.е. Вызывает правильный метод экземпляра).