Хорошо, идея в том, что у меня есть карта «компонентов», которые наследуются от componentBase и имеют ключ к идентификатору, уникальному для самого производного *.
Только я не могу придумать хороший способ заставить это работать. Я попробовал это с конструктором, но это не работает (возможно, я сделал это неправильно). Проблема с любыми виртуальными и т. Д. Трюками наследования заключается в том, что пользователь должен указать их внизу, что можно забыть и сделать их менее ... чистыми.
* Правильная фраза? Если -> наследование; foo является наиболее производным: foo-> foo1-> foo2-> componentBase
Вот код, показывающий проблему, и почему CRTP не может ее устранить:
(Нет, это не законный код, но я пытаюсь обдумать свои мысли)
#include<map>
class componentBase
{ public: virtual static char idFunction() = 0; };
template <class T>
class component
: public virtual componentBase
{
public:
static char idFunction(){ return reinterpret_cast<char>(&idFunction); }
};
class intermediateDerivations1
: public virtual component<intermediateDerivations1>
{
};
class intermediateDerivations2
: public virtual component<intermediateDerivations2>
{ };
class derived1
: public intermediateDerivations1
{ };
class derived2
: public intermediateDerivations1
{ };
//How the unique ID gets used (more or less)
std::map<char, componentBase*> TheMap;
template<class T>
void addToMap(componentBase * c)
{
TheMap[T::idFunction()] = c;
}
template<class T>
T * getFromMap()
{
return TheMap[T::idFunction()];
}
int main()
{
//In each case, the key needs to be different.
//For these, the CRTP should do it:
getFromMap<intermediateDerivations1>();
getFromMap<intermediateDerivations2>();
//But not for these.
getFromMap<derived1>();
getFromMap<derived2>();
return 0;
}
Более или менее мне нужно что-то, что всегда рядом, независимо от того, что делает пользователь, и имеет сортируемое значение, уникальное для самого производного класса.
Кроме того, я понимаю, что это не самый часто задаваемый вопрос, на самом деле у меня возникли некоторые неожиданные затруднения, оборачивающиеся вокруг него словами, поэтому задавайте вопросы, если / когда вам понадобятся разъяснения.
Edit:
Использование бета-формулировки; class производный2 имеет идентификационный номер, уникальный среди всех классов, производных от ComponentBase, и из которых не производны никакие другие классы - за исключением того, что не должно быть случаев использования, в которых мы имеем дело с экземпляром, когда не знаю наиболее производный тип. То есть мы никогда не должны иметь дело с foo1*
, который фактически указывает на `` foo`.
Каждый раз, когда мне нужно получить доступ к этому идентификатору, у меня есть информация о типе наиболее производного класса; через шаблонный характер addComponent, getComponent и removeComponent.
Хм, иначе говоря; Мне нужно «преобразовать» тип в уникальное число, пока я знаю тип, чтобы позже я мог различить две вещи, когда у меня нет информации о типе.