Я пытаюсь добавить в свой код шаблон посетителя и хочу, чтобы он оставался как можно более общим. Точнее, я бы не хотел жестко закодировать функцию обратного вызова в моей функции accept
. Итак, в качестве параметра функции accept
я даю объект boost::function
, который затем вызывается посещенным объектом.
Однако моя проблема в том, что я не могу выполнить привязку к перегруженным функциям (потому что boost :: bind не знает, к какой именно функции привязать), и я не могу привести перегруженную функцию к правильной, потому что я не t знать точный тип посещаемого класса (это важно).
Есть ли способ создать то, что я хочу? Я искал SO, но нашел только вопросы о том, как исправить проблему привязки (что происходит путем литья, чего я не могу сделать).
Ниже приведен код, который не компилируется, но показывает, что я хотел бы заархивировать:
#include <string>
#include <vector>
#include <boost/bind.hpp>
#include <boost/function.hpp>
struct A
{
virtual void acceptVisitor (boost::function<void (A const &)> callbackFnc)
{
callbackFnc(*this);
}
};
struct B : virtual public A {};
std::string printMe (A const & a) { return "A"; }
std::string printMe(B const & a) { return "B"; }
int main()
{
std::vector<std::string> stringVector;
boost::function<void (A const &)> bindedFnc = boost::bind(&std::vector<std::string>::push_back,
&stringVector, boost::bind(&printMe, _1));
A A1;
B A2;
A1.acceptVisitor(bindedFnc);
A2.acceptVisitor(bindedFnc);
}
[Edit] Исправлен пример кода, поскольку предыдущая версия (как заметил ildjarn) на самом деле не вызывала функцию accept
.
push_back
, потому что он может быть перегружен (а в C ++ 0x он гарантированно будет перегружен), и вы не можете устранить неоднозначность с помощью приведения, потому что тип функции-члена стандартной библиотеки не указано (реализация может добавлять дополнительные перегрузки и / или необязательные параметры к своим функциям-членам). - person James McNellis   schedule 14.05.2011acceptVisitor
играет роль? Где собственно посещение? Попробуйте описать то, что вы хотите, потому что вы не продемонстрировали это эффективно. - person ildjarn   schedule 15.05.2011