Мне нужно разработать предикат для алгоритмов stl, таких как find_if, count_if.C++ «умный» предикат для алгоритма stl
namespace lib
{
struct Finder
{
Finder(const std::string& name):
name_(name)
{
}
template< typename TElement >
bool operator(const TElement& element)
{
return element.isPresent(name_);
}
/* template< typename TElement >
bool operator(const TElement& element)
{
const Data& data = element.getData();
return data.isPresent(name_);
}*/
};
}
Но мне нужно, чтобы у меня были разные операторы() в зависимости от наличия определенных методов в TElement. Например, если у меня есть «getData», я бы хотел проверить эти данные, и если бы у меня не было никаких других действий.
Я знаю о SFINAE. Но у меня нет поддержки :: по проекту. Таким образом, существует либо простая реализация шаблона «has_method», либо вы знаете какое-то другое дизайнерское решение.
Я не могу указать конкретные типы и просто перегрузить, потому что я хотел бы поместить этот предикат в одну из библиотеки проектов, которые не знают об этих конкретных классах с методом getData.
Решение с признаками класса хорош настолько, насколько нет пространств имен. Predicate Finder in в пространстве имен lib и класса с «getData» находится в пространстве имен «program».
Спасибо.
Можете ли вы добавить пример использования, чтобы проиллюстрировать, как изменяется поведение? – dirkgently