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, 13:33
Сообщение #2


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

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

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




Репутация:   29  


cpp
class base
{
public:
    base();
    virtual ~base();

    typedef function<bool (int)> SetFunc;
    typedef function<int ()> GetFunc;
    typedef pair<SetFunc, GetFunc> Set_Get_Pair;
    typedef map<string, Set_Get_Pair> PropertyMap;

    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 {
        string str(name);
        PropertyMap::const_iterator i = propMap.find(str);
        return ((i->second).second)();
    }

protected:
    PropertyMap propMap;
    bool register_property(const char* name, SetFunc setprop, GetFunc getprop) {
        return propMap.insert(make_pair(string(name), Set_Get_Pair(setprop, getprop))).second;
    }
};


class device : public base
{
public:
    device() {
    SetFunc sf = bind(&device::setTestProp, this); // ошибка!!!!!
//    GetFunc gf = bind(&device::getTestProp);
//    register_property("Test", sf, gf);
    }

    bool setTestProp(int /*val*/) {
        return true;
    }

    int getTestProp() {
        return 125;
    }
};
вывод
Цитата
/usr/include/boost/bind/mem_fn.hpp: In member function ‘R& boost::_mfi::Dm<R, T>::operator()(T*) const [with R = bool ()(int), T = device]’:
/usr/include/boost/bind/bind.hpp:236: instantiated from ‘R boost::_bi::list1<A1>::operator()(boost::_bi::type<R>, F&, A&, long int) [with R = bool (&)(int), F = boost::_mfi::Dm<bool ()(int), device>, A = boost::_bi::list1<int&>, A1 = boost::_bi::value<device*>]’
/usr/include/boost/bind/bind_template.hpp:32: instantiated from ‘typename boost::_bi::result_traits<R, F>::type boost::_bi::bind_t<R, F, L>::operator()(A1&) [with A1 = int, R = bool (&)(int), F = boost::_mfi::Dm<bool ()(int), device>, L = boost::_bi::list1<boost::_bi::value<device*> >]’
/usr/include/boost/function/function_template.hpp:131: instantiated from ‘static R boost::detail::function::function_obj_invoker1<FunctionObj, R, T0>::invoke(boost::detail::function::function_buffer&, T0) [with FunctionObj = boost::_bi::bind_t<bool (&)(int), boost::_mfi::Dm<bool ()(int), device>, boost::_bi::list1<boost::_bi::value<device*> > >, R = bool, T0 = int]’
/usr/include/boost/function/function_template.hpp:904: instantiated from ‘void boost::function1<R, T1>::assign_to(Functor) [with Functor = boost::_bi::bind_t<bool (&)(int), boost::_mfi::Dm<bool ()(int), device>, boost::_bi::list1<boost::_bi::value<device*> > >, R = bool, T0 = int]’
/usr/include/boost/function/function_template.hpp:720: instantiated from ‘boost::function1<R, T1>::function1(Functor, typename boost::enable_if_c<boost::type_traits::ice_not::value, int>::type) [with Functor = boost::_bi::bind_t<bool (&)(int), boost::_mfi::Dm<bool ()(int), device>, boost::_bi::list1<boost::_bi::value<device*> > >, R = bool, T0 = int]’
/usr/include/boost/function/function_template.hpp:1040: instantiated from ‘boost::function<R ()(T0)>::function(Functor, typename boost::enable_if_c<boost::type_traits::ice_not::value, int>::type) [with Functor = boost::_bi::bind_t<bool (&)(int), boost::_mfi::Dm<bool ()(int), device>, boost::_bi::list1<boost::_bi::value<device*> > >, R = bool, T0 = int]’
main.cpp:129: instantiated from here
/usr/include/boost/bind/mem_fn.hpp:342: error: invalid use of non-static member function


Что я опять делаю не так ???
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


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




RSS Текстовая версия Сейчас: 23.11.2024, 5:31