Вопрос

Мне нужна функция, которая устанавливает для моего класса политику отображения элементов.например:

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
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top