Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> адрес метода в mpl тип 
V
    Опции темы
boostcoder
Дата 12.1.2011, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



всем привет.
код:
Код

#include <iostream>

#include <boost/mpl/at.hpp>
#include <boost/mpl/vector.hpp>

#include <boost/bind.hpp>
#include <boost/function.hpp>

struct test {
   void m1() { std::cout << "test::m1()" << std::endl; }
   void m2() { std::cout << "test::m2()" << std::endl; }
};

typedef boost::mpl::vector<
   test, // class type
   void(), // signature
   &test::m2 // method name <<<<<<<<<<<<<<<<<<<<<<<<<<
> meta;

int main() {
   boost::mpl::at_c<meta, 0>::type obj;
   obj.m1();
   
   boost::function<
      boost::mpl::at_c<meta, 1>::type // get signature
   > f = boost::bind(boost::mpl::at_c<meta, 2>::type, &obj);
}


http://liveworkspace.org/code/ec58c0ac901a...0cfb731946a6372

в общем, идея в том, чтоб первым аргументом в boost::bind() подставлять методы которые хранятся в mpl последовательности.
но что-то компилятор не позволяет в mpl последовательность пихать имена методов. и, я подозреваю, что он прав.

к примеру, если этот код изменить так, то все ок.
Код

#include <iostream>

#include <boost/mpl/at.hpp>
#include <boost/mpl/vector.hpp>

#include <boost/bind.hpp>
#include <boost/function.hpp>

struct test {
   void m1() { std::cout << "test::m1()" << std::endl; }
   void m2() { std::cout << "test::m2()" << std::endl; }
};

typedef boost::mpl::vector<
   test, // class type
   void() // signature
> meta;

int main() {
   boost::mpl::at_c<meta, 0>::type obj;
   obj.m1();
   
   boost::function<
      boost::mpl::at_c<meta, 1>::type // get signature
   > f;
}


http://liveworkspace.org/code/9bc14fc4f533...abbca9544b68b8c

спасибо.

Это сообщение отредактировал(а) boostcoder - 19.1.2011, 17:27
PM WWW   Вверх
mes
Дата 12.1.2011, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата

 &test::m2 // method name <<<<<<<<<<<<<<<<<<<<<<<<<<

где ж это имя ? это адрес..



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 12.1.2011, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  12.1.2011,  22:38 Найти цитируемый пост)
где ж это имя ?

ну да, хранится адрес, а записываю имя smile 
Вы поняли что я имел ввиду smile 

как такое можно проделать?

Добавлено через 2 минуты и 22 секунды
Цитата(mes @  12.1.2011,  22:38 Найти цитируемый пост)
это адрес..

идея!
ща..

Добавлено через 13 минут и 39 секунд
нет. не правильная идея :(

есть какие-то варианты?
PM WWW   Вверх
mes
Дата 12.1.2011, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  12.1.2011,  21:40 Найти цитируемый пост)
ну да, хранится адрес, а записываю имя  
Вы поняли что я имел ввиду  

но Вы меня по-мойму нет smile
список типов, а пытаетесь сохранить в нем значение smile

Добавлено @ 23:08
Цитата(boostcoder @  12.1.2011,  21:40 Найти цитируемый пост)
идея!

добавить wrapper mpl::int_ ? насколько я знаю, не пойдет ибо адрес метода не конвертится в инт..

Цитата(boostcoder @  12.1.2011,  21:40 Найти цитируемый пост)
есть какие-то варианты? 

сейчас посмотрю, что пытаетесь этим сделать..

Добавлено через 6 минут и 38 секунд
Цитата(boostcoder @  12.1.2011,  21:16 Найти цитируемый пост)
в общем, идея в том, чтоб первым аргументом в boost::bind() подставлять методы которые хранятся в mpl последовательности.

a плейсхолдеры кто в таком случае подставлять будет?

Это сообщение отредактировал(а) mes - 12.1.2011, 23:12


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 12.1.2011, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  12.1.2011,  23:07 Найти цитируемый пост)
но Вы меня по-мойму нет 
список типов, а пытаетесь сохранить в нем значение

да-да. допер)

&test::m1 - это адрес.
его тип - void(test::*)(). правильно?

но тогда, по идее, нужен fusion::vector?

Добавлено через 1 минуту и 53 секунды
Цитата(mes @  12.1.2011,  23:07 Найти цитируемый пост)
a плейсхолдеры кто в таком случае подставлять будет?

дааа... плейсхолдеры.. :(
PM WWW   Вверх
mes
Дата 12.1.2011, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  12.1.2011,  22:14 Найти цитируемый пост)
его тип - void(test::*)(). правильно?

если строго, то нет..  не его тип smile



Это сообщение отредактировал(а) mes - 12.1.2011, 23:19


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 12.1.2011, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  12.1.2011,  23:19 Найти цитируемый пост)
если строго, то нет..  не его тип

это как? не понял...
PM WWW   Вверх
mes
Дата 12.1.2011, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  12.1.2011,  22:14 Найти цитируемый пост)
но тогда, по идее, нужен fusion::vector?

тогда нужно привести адрес к целочисленному типу.. а это не позволительно.. 

теоретически нужен wrapper для преобразования адреса в тип, наподобие вышеупомянутого mpl::int_

Добавлено через 4 минуты и 34 секунды
Цитата(boostcoder @  12.1.2011,  22:22 Найти цитируемый пост)
это как? не понял... 

если "его" - это адрес, то правильно..
я почему то подумал, что речь о методе.. 




--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 12.1.2011, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  12.1.2011,  23:23 Найти цитируемый пост)
теоретически нужен wrapper для преобразования адреса в тип, наподобие вышеупомянутого mpl::int_

т.е. нужен шаблон типа: method_address< ??? >::type ?
а какой в этом случае должен быть тип параметра шаблона?

Это сообщение отредактировал(а) boostcoder - 12.1.2011, 23:38
PM WWW   Вверх
mes
Дата 12.1.2011, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250





--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 12.1.2011, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



вроде понял. попробую реализовать.
спасибо smile 

зы
тему пока не закрываю.
PM WWW   Вверх
boostcoder
Дата 13.1.2011, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



mes, здравствуйте.
скажите, я правильно понимаю, что адрес метода(или его смещение) известно в компайл-тайм?
PM WWW   Вверх
mes
Дата 13.1.2011, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  13.1.2011,  10:48 Найти цитируемый пост)
скажите, я правильно понимаю, что адрес метода(или его смещение) известно в компайл-тайм? 

ммм... так же как и у функции.. с теми же ограничениями.. 



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 13.1.2011, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  13.1.2011,  14:35 Найти цитируемый пост)
так же как и у функции.. с теми же ограничениями.. 

осталось выяснить совсем чуток: как, и с какими smile 

Это сообщение отредактировал(а) boostcoder - 13.1.2011, 16:18
PM WWW   Вверх
mes
Дата 13.1.2011, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



из того, что я знаю:
 значение адреса  функции не является const_expr
 адрес можно использовать как шаблон параметра.. 




--------------------
PM MAIL WWW   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0595 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.