Объединение предикатов

SASS и LESS поддерживают пространство имен из коробки.

.app1-styles {
  @import (app1) url("app1.css");
}
7
задан drby 13 February 2009 в 09:54
поделиться

3 ответа

Я могу рекомендовать boost.lambda для объединения функциональных объектов для таких задач. Хотя это - немного тяжеловес для такой простой проблемы. (редактирование) Видит общественный ответ Wiki, запущенный xhantt для хорошего примера с помощью STL.

(старый, удержанный от использования, ответ), можно записать собственную утилиту для этого, подобного:

// here we define the combiner...
template<class Left, class Right>
class lazy_or_impl {
  Left m_left;
  Right m_right;
public:
  lazy_or_impl(Left const& left, Right const& right) : m_left(left), m_right(right) {}
  typename Left::result_type operator()(typename Left::argument_type const& a) const {
    return m_left(a) || m_right(a);
  }
};

// and a helper function which deduces the template arguments
// (thx to xtofl to point this out)
template<class Left, class Right>
lazy_or_impl<Left, Right> lazy_or(Left const& left, Right const& right) {
  return lazy_or_impl<Left, Right>(left, right);
}

и затем используйте его: ... lazy_or(bind1st(...), bind1st(...)) ...

5
ответ дан 6 December 2019 в 15:32
поделиться

Хорошо у Вас есть станд.:: logical_or и станд.:: compose2, который может сделать задание

find_if(tokens.begin(), tokens.end(), 
  compose2(logical_or<bool>(),
    bind2nd(MatchBeginning(), "-b"),
    bind2nd(MatchBeginning(), "-")
  ) 
);

но я думаю что повышение:: лямбда и/или феникс более читаемы в конце и являются моим рекомендуемым решением.

Кредиты должны перейти к документации SGI.

5
ответ дан 6 December 2019 в 15:32
поделиться

Если Вы хотите составить предикаты, самый хороший способ записать, что он, вероятно, использует Лямбду Повышения или Повышение Финикс:

// Lambda way:
// Needs:
// #include <boost/lambda/lambda.hpp>
// #include <boost/lambda/bind.hpp>
{
    using namespace boost::lambda;
    foo_vec::const_iterator it
        = std::find_if(
                    tokens.begin(),
                    tokens.end(),
                    bind(MatchBeginning(), _1, "-b") || !bind(MatchBeginning(), _1, "-")
                    );
}
// Boost bind way:
// Needs:
// #include <boost/bind.hpp>
{
    foo_vec::const_iterator it
        = std::find_if(
                    tokens.begin(),
                    tokens.end(),
                    boost::bind(
                                std::logical_or<bool>(),
                                boost::bind(MatchBeginning(), _1, "-b"),
                                !boost::bind(MatchBeginning(), _1, "-") // ! overloaded in bind
                               )
                    );

Для Финикса путем одна из возможностей состоит в том, чтобы использовать феникса ленивые функции, и решение могло выглядеть подобным тому ниже:

// Requires:
// #include <boost/spirit/include/phoenix_core.hpp>
// #include <boost/spirit/include/phoenix_function.hpp>
// #include <boost/spirit/include/phoenix_operator.hpp>
namespace phx = boost::phoenix;

struct match_beginning_impl
{
    template <typename Arg1, typename Arg2>
    struct result
    {
        typedef bool type;
    };

    template <typename Arg1, typename Arg2>
    bool operator()(Arg1 arg1, Arg2 arg2) const
    {
        // Do stuff
    }
};
phx::function<match_beginning_impl> match_beginning;

using phx::arg_names::arg1;

foo_vec::const_iterator it
    = std::find_if(
                tokens.begin(),
                tokens.end(),
                match_beginning(arg1, "-b") || !match_beginning(arg1, "-")
                );

Однако для выполнения задачи, вероятно, имеет больше смысла использовать различные инструменты - например: регулярные выражения (Повышают Regex или Повышение Xpressive). Если Вы хотите обработать параметры командной строки, затем используют Опции Программы Повышения.

4
ответ дан 6 December 2019 в 15:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: