Итак, идея состоит в том, что у меня есть карта «компонентов», которая наследуется от 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;
}
Более или менее, мне нужно что-то, что всегда есть, независимо от того, что делает пользователь, и имеет Сортируемое значение, уникальные для наиболее производного класса.
Кроме того, я понимаю, что это не самый лучший вопрос, я на самом деле неожиданно затрудняюсь обмануть его в словах, поэтому задавайте вопросы, если/когда вам нужно разъяснение.
Редактировать: Использование фразы Бета; Класс имеет номер идентификатора, уникальный среди всех классов, полученных из ComponentBase, и из которых не выведены никакие другие классы, за исключением того, что не должно быть случаев использования, в которых мы имеем дело с экземпляром, когда мы не знаем самый производный тип. То есть нам никогда не придется иметь дело с foo1*
, который фактически указывает на `` foo`.
В любое время, когда мне нужно получить доступ к этому ID, у меня есть информация о самом производном классе; через шаблонный характер addComponent, getComponent и removeComponent.
Хм, другими словами; Мне нужно «преобразовать» тип в уникальный номер, в то время как я знаю тип, так что я могу позже различать две вещи, когда у нет есть информация о типе.
Вы уже задавали подобные вопросы. Как это отличается? – Tronic
Вы имеете в виду, что каждый экземпляр производного2 имеет идентификационный номер, уникальный среди всех экземпляров ComponentBase? Или что класс производный2 имеет идентификационный номер, уникальный среди всех классов, полученных из ComponentBase? Или среди всех классов, полученных из ComponentBase * и из которых не выведены никакие другие классы *? – Beta
@Tronic: Предыдущие вопросы не касались наследования; как таковой, можно было легко гарантировать idFunction(), который соответствовал ограничениям, поскольку для его реализации не было никакой зависимости от программиста-пользователя. – Narfanator