Можно ли каким-то образом получить базу определенного класса, чтобы она могла передаваться по цепочке шаблонов, например, так (псевдокод)
template<typename base>
class first
{
template_taking_base<base>* member;
}
template<typename derived>
class second: public first< function_giving_me_base_of_derived >
{
derived* get( string s ) { dynamic_cast<derived>( member->get_base( s ) ); }
}
Во избежание
template<typename base, typename derived>
class second: public first<base>
{
//...
}
Зачем это нужно?
У меня есть два разных типа ресурсов: те, которые находятся в основной памяти, и те, которые находятся в памяти gpu, в настоящее время это выглядит примерно так:
basic_resource
/ \
/ \
cpu_resource gpu_resource
| |
many_derived many_derived
У меня также есть дескрипторы этих ресурсов. Идея в том, что у вас будет
handle<image> someimage("blah.bmp")
image the_image = someimage.get();
Где функция get запрашивает кеш для получения ресурса. Кэш возвращает cpu_resource или gpu_resource, в то время как дескриптор динамически преобразует его в шаблонный ресурс (в изображении выше).
Сам кеш это шаблон
template<typename resource_base>
class cache
{
public:
//...
resource_base* get_resource( string name )
private:
//...
}
Где база ресурсов должна быть либо cpu_resource, либо gpu_resource, с соответствующими специализациями в различных функциях-членах шаблона кэша.
Таким образом, дескриптор, хранящий указатель на кэш, должен знать базовый тип ресурса, для которого он дескриптор.
В частности
template<typename resource_type>
class handle
{
string name;
cache< /*need the base of resource_type here*/ >* cache
resource_type* get( void ) { dynamic_cast<resource_type>( cache->get( name ) ); }
}
Я пытался обобщить проблему, чтобы я мог получить ответ быстрее, но это не сработало, так что, возможно, так и будет. Если вам нужно больше подробностей, пожалуйста, спросите.