Вектор указателей на разные методы класса
От: Towelie  
Дата: 12.04.11 19:52
Оценка:
Возможно ли создать вектор указателей на методы разных классов, которые все одного типа?
Re: Вектор указателей на разные методы класса
От: Vamp Россия  
Дата: 12.04.11 20:05
Оценка:
T>Возможно ли создать вектор указателей на методы разных классов, которые все одного типа?
В твоем вопросе внутреннее противоречие. Если методы разных классов, то их тип разный, потому что в тип метода формально входит его класс. Тем не менее, если размер указателя на все эти методы одинаковый (например, они все невиртуальные), то можно положить в вектор обобщенный указатель и приводить типы вручную... но я не рекомендую.
Да здравствует мыло душистое и веревка пушистая.
Re: Вектор указателей на разные методы класса
От: rm822 Россия  
Дата: 12.04.11 20:34
Оценка: +1
T>Возможно ли создать вектор указателей на методы разных классов, которые все одного типа?
конечно,они же контр-вариантные
пусть твои классы A,B,C

class D: public A, public B, public C {}
typedef void (D::*MySig)(int);

любой указатель из А,Б,Ц кастится к MySig при условии совадения сигнатуры
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Вектор указателей на разные методы класса
От: Sni4ok  
Дата: 13.04.11 08:55
Оценка: -2
Здравствуйте, Towelie, Вы писали:

T>Возможно ли создать вектор указателей на методы разных классов, которые все одного типа?


std::vector<void*> pointers;
Re[2]: Вектор указателей на разные методы класса
От: SleepyDrago Украина  
Дата: 13.04.11 09:07
Оценка:
Здравствуйте, Sni4ok, Вы писали:

S>Здравствуйте, Towelie, Вы писали:


T>>Возможно ли создать вектор указателей на методы разных классов, которые все одного типа?


S>std::vector<void*> pointers;


хинт sizeof(void*) намного меньше чем у указателей на методы.
Re[2]: Вектор указателей на разные методы класса
От: jyuyjiyuijyu  
Дата: 13.04.11 09:45
Оценка:
Здравствуйте, Sni4ok, Вы писали:

S>Здравствуйте, Towelie, Вы писали:


T>>Возможно ли создать вектор указателей на методы разных классов, которые все одного типа?


S>std::vector<void*> pointers;

если без множественного наследования то у меня vs2008 х86 размер указателя на метод
имеет такой же размер как и указатель void* 4 байта а если со множественным то 8 байт
struct foo
{
    void f(){}
};
struct boo
{
    void f(){}
};
struct d:foo,boo
{};
int main()
{
    void(d::*arr[])()={&foo::f,&boo::f};
    (obj.*arr[1])();
}

каждый элемент массива это адрес метода + смещение добавляемое к this при вызове
00401032 00000000 0040105f 00000001

00401A7A 8B 4D FC         mov         ecx,dword ptr [ebp-4] ;offset = arr[1].offset;
00401A7D 8D 4C 0D EF      lea         ecx,obj[ecx]          ;this = this + offset
00401A81 FF 55 F8         call        dword ptr [ebp-8]     ;this->*arr[1].address;
Re[3]: Вектор указателей на разные методы класса
От: Erop Россия  
Дата: 13.04.11 10:11
Оценка:
Здравствуйте, jyuyjiyuijyu, Вы писали:

J>имеет такой же размер как и указатель void* 4 байта а если со множественным то 8 байт

J>каждый элемент массива это адрес метода + смещение добавляемое к this при вызове
А если есть виртуальные базы, то может быть и ещё больше...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Вектор указателей на разные методы класса
От: XuMuK Россия  
Дата: 13.04.11 10:33
Оценка:
Здравствуйте, Towelie, Вы писали:

T>Возможно ли создать вектор указателей на методы разных классов, которые все одного типа?


не нужно, если все методы имеют одинаковую сигнатуру создайте вектор объектов boost::function или воспользуйтесь полиморфизмом. что в конечном итоге планируется делать с этим вектором?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.