crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Аналог Q_PROPERTY
igor_bogomolov
  опции профиля:
сообщение 30.7.2009, 10:58
Сообщение #1


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Пытаюсь реализовать аналог Q_PROPERTY.

Раскрывающийся текст
class base {
public:
    typedef bool(*sp)(int);
    typedef int(*gp)();
    typedef std::pair<sp, gp> prop;
    typedef std::map<std::string, prop> PropertyMap;

public:
    base() {}
    virtual ~base() {}

public:
    bool setProperty(const char* name, int value) {
        std::string str(name);
        PropertyMap::const_iterator i = propMap.find(str);
        ((i->second).first)(value);
        return true;
    }

    int property(const char* name) const {
        std::string str(name);
        PropertyMap::const_iterator i = propMap.find(str);
        return ((i->second).second)();
    }

protected:
    PropertyMap propMap;
    bool register_property(const char* name, sp setprop, gp getprop) {
        return propMap.insert(std::make_pair(std::string(name), prop(setprop, getprop))).second;
    }
};


class base1 : public base
{
public:
    base1() {
        //register_property("TEST",&base1::setTestProp, &base1::getTestProp()); //< ??? Проблема здесь
    }

    bool setTestProp(int val) {
        return true;
    }

    int getTestProp() {
        return 125;
    }
};


Весь затык в том, что в базовый класс надо передать указатели на не статические методы классов потомков.
Как можно решить эту проблему?

Можно конечно для каждого метода делать,что-то вроде
static int call_getTestProp(base1& param) {
     return param.getTestProp();
}
и передавать указатель уже этого метода
Но тогда весь смысл в свойствах теряется.
Как быть?


Кто-нибудб делал что-то подобное. Может есть другой способ реализации PROPERTY?

Сообщение отредактировал igor_bogomolov - 30.7.2009, 11:02
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
igor_bogomolov
  опции профиля:
сообщение 30.7.2009, 11:54
Сообщение #2


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(BRE @ 30.7.2009, 12:41) *
Посмотри на boost::bind
Все утро на него смотрю и на boost::ref, boost::mem_fn, boost::function.
Ничего не получается. Не могу разобраться. Только начал разбираться с boost. Сложен он для меня (((

register_property("TEST",boost::bind(&base1::setTestProp), boost::bind(&base1::getTestProp));

Выдает кучу ошибок. Не пойму как переделать надо?
Поможите, а? )))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 30.7.2009, 12:01
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(igor_bogomolov @ 30.7.2009, 12:54) *
Ничего не получается. Не могу разобраться. Только начал разбираться с boost. Сложен он для меня (((

register_property("TEST",boost::bind(&base1::setTestProp), boost::bind(&base1::getTestProp));

Выдает кучу ошибок. Не пойму как переделать надо?
Поможите, а? )))

Попробуй так:
register_property( "TEST", boost::bind( &base1::setTestProp, this ), boost::bind( &base1::getTestProp, this ) );
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.11.2024, 13:00