Как ссылаться на экземпляры класса CRTP без указания типаC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как ссылаться на экземпляры класса CRTP без указания типа

Сообщение Anonymous »

Я пытаюсь реализовать CRTP в своей программе:

Код: Выделить всё

#ifndef CHAMBER_H
#define CHAMBER_H
#include 
#include 
class FoodChamber;
template
class Chamber
{
friend Chamber;
protected:
const inline static std::string m_idPrefix = ChamberType::m_idPrefix;
inline static int ChamberTypeCount = 0;
int m_logicalId = ChamberTypeCount++;
std::string m_displayId = "";
public:
inline static std::map ADJACENCY_LIST = {}; // Chamber : its neighbours.
void AddEdge(Chamber *firstChamber, Chamber *secondChamber)
{
std::vector& neighbourChambers = ADJACENCY_LIST[firstChamber];
for (Chamber* neighbourChamber : neighbourChambers){
if (neighbourChamber == secondChamber) return;
}
neighbourChambers.push_back(secondChamber);
}
std::string getDisplayId()
{
return m_displayId;
}
Chamber(){
m_displayId = m_idPrefix+std::to_string(m_logicalId);
}

virtual void display() const = 0;
};

#endif // CHAMBER_H
Причина, по которой я выбрал CRTP, заключается в том, что каждый класс должен отслеживать свой собственный идентификатор. Итак, если я создаю 2 камеры с едой, я хочу, чтобы они имели идентификаторы 0 и 1, но если я создаю QueenChamber после того, как хочу, чтобы у нее был идентификатор 0. Проблема в моем классе AntHill:

Код: Выделить всё

#ifndef ANTHILL_H
#define ANTHILL_H
#include 
#include "Chamber.h"
class AntHill
{
private:
std::map m_chambersRegister = {};
public:
AntHill();
void addChamber(Chamber* chamber);
void addEdge(Chamber* firstChamber, Chamber* secondChamber);
void display();

};

#endif // ANTHILL_H
Мне нужно указать в члене и функциях, какой тип Палаты будет добавлен, но это может быть любой тип, и я не хочу также использовать шаблон AntHill, поскольку это не то, что нужно.
Как мне это сделать? Желательно без удаления CRTP, так как в противном случае в функции идентификатора мне придется реализовать огромный if или переключиться на назначение идентификатора на основе типа.

Подробнее здесь: https://stackoverflow.com/questions/798 ... which-type
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»