SASS и LESS поддерживают пространство имен из коробки.
.app1-styles {
@import (app1) url("app1.css");
}
Я могу рекомендовать 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(...)) ...
Хорошо у Вас есть станд.:: logical_or и станд.:: compose2, который может сделать задание
find_if(tokens.begin(), tokens.end(),
compose2(logical_or<bool>(),
bind2nd(MatchBeginning(), "-b"),
bind2nd(MatchBeginning(), "-")
)
);
но я думаю что повышение:: лямбда и/или феникс более читаемы в конце и являются моим рекомендуемым решением.
Кредиты должны перейти к документации SGI.
Если Вы хотите составить предикаты, самый хороший способ записать, что он, вероятно, использует Лямбду Повышения или Повышение Финикс:
// 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). Если Вы хотите обработать параметры командной строки, затем используют Опции Программы Повышения.