Мало дополнения. Можно использовать boost::function
, для создания функторов из функций и методов, как это:
class Foo
{
public:
void operator () (int i) { printf("Foo %d", i); }
};
void Bar(int i) { printf("Bar %d", i); }
Foo foo;
boost::function f(foo);//wrap functor
f(1);//prints "Foo 1"
boost::function b(&Bar);//wrap normal function
b(1);//prints "Bar 1"
и можно использовать повышение:: свяжите для добавления состояния к этому функтору
boost::function f1 = boost::bind(foo, 2);
f1();//no more argument, function argument stored in f1
//and this print "Foo 2" (:
//and normal function
boost::function b1 = boost::bind(&Bar, 2);
b1();// print "Bar 2"
и самый полезный с повышением:: свяжите и повысьте:: функция можно создать функтор из метода класса, на самом деле это - делегат:
class SomeClass
{
std::string state_;
public:
SomeClass(const char* s) : state_(s) {}
void method( std::string param )
{
std::cout << state_ << param << std::endl;
}
};
SomeClass *inst = new SomeClass("Hi, i am ");
boost::function< void (std::string) > callback;
callback = boost::bind(&SomeClass::method, inst, _1);//create delegate
//_1 is a placeholder it holds plase for parameter
callback("useless");//prints "Hi, i am useless"
можно создать список или вектор функторов
std::list< boost::function > events;
//add some events
....
//call them
std::for_each(
events.begin(), events.end(),
boost::bind( boost::apply(), _1, e));
существует одна проблема со всем этим материалом, ошибка компилятора обменивается сообщениями, не человекочитаемо:)
Выполните:
Не:
Чтобы использовать аналогию, ваш API должен работать больше как GPS для ваших клиентов, а не как карта. Вы будете сообщать клиентам только название ближайшей улицы. Но с этого момента они могут делать только то, что ваше приложение говорит, что они могут делать в любой данный момент.
Цель этого стиля - минимизировать связь между вашим приложением и его клиентами. Вся связка должна происходить в вашем определении типа носителя. Это упрощает развитие API и обеспечивает удобный механизм управления версиями. Это также снимает вопросы о таких проблемах, как разбиение на страницы.
Большинство «RESTful» API не следуют этому шаблону. Для того, кто это делает,
Воспользуйтесь преимуществами базового протокола, где это возможно. Вместо использования глаголов в полезной нагрузке попробуйте использовать (например) методы HTTP GET, POST, PUT, DELETE. Ваш URI должен описывать ресурс, но не то, что с ним делать.
Вот некоторые вещи, которых следует избегать:
Есть хорошая статья здесь говорится о некоторых антишаблонах REST:
Вроде широкий вопрос, но я попробую. Во-первых, используйте HTTP-глаголы только так, как они были задуманы. Не отправляйте POST на URL-адрес с аргументом url, который в основном переопределяет POST и превращает его в GET или DELETE. Вот как работает протокол SOAP (все является POST).
В этой статье подробно описаны некоторые дизайнерские решения, которые отличают RPC от REST:
http: / /www.pluralsight. com / community / blogs / tewald / archive / 2007/04/28 / 47067.aspx
@ S.Lott: спасибо, я искренне думал, что опубликовал это как ответ, а не комментарий. Я теряю свои шарики.