Несколько предикатов, указанных во время выполнения - PullRequest
3 голосов
/ 07 октября 2011

В STL есть классы операторов, такие как less, equal_to, more_equal и т. Д. Как легко объединить их для использования, например, с функцией remove_if?

Например, я хочу удалить в векторах элементы, которые больше 0 И меньше 3 И не равны 2, тогда это будет что-то вроде:

remove_if (v.begin(), v.end(), bind2nd(greater<int>(),0) + bind2nd(less<int>(),3) + not1(bind2nd(equal_to<int>(), 2)));

Пользователь во время работы программы может указать параметры фильтрации, например, он может написать: удалить, если x> 0 && x <3 && x! = 2, или он может написать: удалить, если x> 5 || x == 3. Затем команда анализируется и соответствующие операторы с их аргументами объединяются в один предикат.

Ответы [ 2 ]

3 голосов
/ 07 октября 2011

Это довольно просто в вашем случае, на самом деле.

Сначала вам нужно проанализировать оператор, выданный пользователем, и превратить его в AST (абстрактное синтаксическое дерево).Оказывается, этот AST уже почти подходит.

x > 0 && x < 3 && x != 2

Может быть выражен в виде дерева:

      AND
     /   \
    >     AND
   / \   /    \
  x  0   <    !=
        / \   / \
       x   3 x   2

Все узлы должны наследоваться от общего базового класса, и вы должны реализоватьVisitor для оценки параметра x для данного значения.

0 голосов
/ 07 октября 2011

Я предполагаю, что под «динамическим объединением» вы подразумеваете возможность «составлять» предикат «in-line».В вашем примере предикат известен во время компиляции, поэтому термин «динамический» не подходит для этого.

Рассмотрим «Boost.Bind».Он предлагает перегрузку операторов для композиции.

bind(greater<int>(),_1,0) && bind(less<int>(),_1,3) && !bind(equal_to<int>(), _1, 2)

Редактировать: Учитывая ваше объяснение "динамической композиции", приведенный выше код не то, что вам нужно.Вам нужен анализатор выражений и оценщик.Но это не имеет ничего общего с вашим реальным примером кода.Нет простого решения для этого.Вы можете попробовать проверить некоторые библиотеки синтаксического анализатора выражений и посмотреть, подходят ли / какие из них для вашей проблемы.

...