Мне нужен простой способ получить счетчик/длину/размер объекта класса 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
(т.е. Вызывает правильный метод экземпляра).