Передайте унарный предикат функции в C++
Вопрос
Мне нужна функция, которая устанавливает для моего класса политику отображения элементов.например:
SetDisplayPolicy(BOOLEAN_PRED_T f)
Это предполагает, что BOOLEAN_PRED_T является указатель на функцию к некоторому логическому типу предиката, например:
typedef bool (*BOOLEAN_PRED_T) (int);
Меня интересует только, например:отображать что-либо, когда переданный предикат имеет значение TRUE, и не отображать, когда он является ложным.
Приведенный выше пример работает для функций, возвращающих bool и принимающих int, но мне нужен очень общий указатель для аргумента SetDisplayPolicy, поэтому я подумал об UnaryPredicate, но он связан с повышением.Как передать унарный предикат функции в STL/C++? unary_function< bool,T >
не будет работать, потому что мне нужно логическое значение в качестве возвращаемого значения, но я хочу попросить пользователя просто указать «унарную функцию, возвращающую логическое значение», в самом общем подходе.
Я думал о том, чтобы получить свой собственный тип как:
template<typename T>
class MyOwnPredicate : public std::unary_function<bool, T>{};
Может ли это быть хорошим подходом?
Решение
Повернуть SetDisplayPolicy
в шаблон функции:
template<typename Pred>
void SetDisplayPolicy(Pred &pred)
{
// Depending on what you want exactly, you may want to set a pointer to pred,
// or copy it, etc. You may need to templetize the appropriate field for
// this.
}
Затем для использования выполните:
struct MyPredClass
{
bool operator()(myType a) { /* your code here */ }
};
SetDisplayPolicy(MyPredClass());
В коде отображения вы бы сделали что-то вроде:
if(myPred(/* whatever */)
Display();
Конечно, вашему функтору может потребоваться состояние, и вы можете захотеть, чтобы его конструктор что-то делал и т. д.Дело в том, что SetDisplayPolicy
не имеет значения, что вы ему даете (включая указатель на функцию), при условии, что вы можете прикрепить к нему вызов функции и получить обратно bool
.
Редактировать: И, как сказал csj, вы можете наследовать от STL unary_function
который делает то же самое и также купит вам два typedef
с argument_type
и result_type
.
Другие советы
Вы на правильном пути, поскольку unary_function задумана как базовый класс.Однако обратите внимание, что первым параметром должен быть тип аргумента, а вторым — тип_результата.Затем все, что вам нужно сделать, это реализовать оператор()
template<typename T>
struct MyOwnPredicate : public std::unary_function<T,bool>
{
bool operator () (T value)
{
// do something and return a boolean
}
}