[done]с++, templates передача типа указателя на родителя.

Phoenix

 


#include <stdio.h>


class SuperStorage25;

template<class StorageType>
class Connection;

template<class EventType>
class BaseEvent
{
public:
EventType handler;

void event(void* p, ssize_t s)
{
handler.event(p,s);
};
// many-many other methods.
};

class Event1
{
public:
typedef BaseEvent<Event1> DadType;

void event(void*, ssize_t)
{
printf("ev1, event \n");
// call Connection::func1 here ?

};
};


class Event2
{
public:
typedef BaseEvent<Event2> DadType;

void event(void*, ssize_t)
{

};
};

template<class StorageType>
class Connection
{
public:
BaseEvent<Event1> ev1;
BaseEvent<Event1> ev2;
void func1
{
printf("func1 \n");
};

void iter
{
printf("iteri \n");
ev1.event(NULL, 0);
};
};

class SuperStorage25
{
};

int main
{
Connection<SuperStorage25> sas;
sas.iter;
return 0;
}

Как можно из Event1::event вызвать Connection<>::func1 ? Виртуальными функциями бы не хотелось очень пользоваться.

apl13

Я честно нихуя не понял!

Phoenix

я понял, как .нужно аккуратненько все типы переписать. Блин. Обидно, уже всё переделал
 #include <stdio.h>


class SuperStorage25;

template<class StorageType>
class Connection;

template<class EventType, class ConnectionType>
class BaseEvent
{
public:
EventType handler;

void event(void* p, ssize_t s)
{
handler.event(p,s);
};
// many-many other methods.
};

template<class ConnectionType>
class Event1
{
public:
typedef BaseEvent<Event1<ConnectionType>,ConnectionType> DadType;
ConnectionType *grandfather;

void event(void*, ssize_t)
{
printf("ev1, event \n");
grandfather->func1;

};
};


template<class ConnectionType>
class Event2
{
public:
typedef BaseEvent<Event2<ConnectionType>,ConnectionType> DadType;
ConnectionType *grandfather;

void event(void*, ssize_t)
{

};
};

template<class StorageType>
class Connection
{
public:
BaseEvent<Event1<Connection<StorageType> >, Connection<StorageType> > ev1;
BaseEvent<Event1<Connection<StorageType> >, Connection<StorageType> > ev2;
void func1
{
printf("func1 \n");
};

void iter
{
ev1.handler.grandfather = this;
printf("iteri \n");
ev1.event(NULL, 0);
};
};

class SuperStorage25
{
};

int main
{
Connection<SuperStorage25> sas;
sas.iter;
return 0;
}

Phoenix

а есть какое-то ключевое слово, указывающее на собственный тип ? А то много одного и того же написано.
 

template <class T, class T2>
class AB
{
typedef AB<T,T2> owntype;
}

для owntype есть что-то чтобы 2 раза одно и тоже не писать, а то могут быть ведь трёхэтажные конструкции

PITACHOK

для owntype есть что-то чтобы 2 раза одно и тоже не писать, а то могут быть ведь трёхэтажные конструкции
что-то я не вижу, чтобы у тебя много раз встречалась в коде такая конструкция

Phoenix

event1, event2, connection. Ну и в любом другом будет, если нужен указатель на родителя, нужен его тип.

spitfire

на собственный тип ?
В C++11 можно сказать std::remove_reference<decltype(*this)>::type (это я решил выяснить работает ли decltype(*this) и нашёл вот этот ответ, с весьма внятным пояснением).
Оставить комментарий
Имя или ник:
Комментарий: