Получение базового типа (типов) из параметра шаблона - PullRequest
0 голосов
/ 16 ноября 2011

Можно ли каким-то образом получить базу определенного класса, чтобы она могла передаваться по цепочке шаблонов, например, так (псевдокод)

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 ) ); }
}

Я пытался обобщить проблему, чтобы я мог получить ответ быстрее, но это не сработало, так что, возможно, так и будет. Если вам нужно больше подробностей, пожалуйста, спросите.

1 Ответ

0 голосов
/ 16 ноября 2011

Любой производный класс уже имеет тип base , так почему вы хотите это сделать?

Если вам нужно, вы можете сделать что-то подобное

class A
{   
public:
    A()
    {
    }
};

class ADer : public A
{
public:
    typedef A base_t;
};

class B
{
public:
    B()
    {
    }
};

class BDer : public B
{
public:
    typedef B base_t;
};

template <typename T>
void Foo()
{
    typename T::base_t x;
    // Here x will always be base class of T
}


int main()
{
    Foo<BDer>();
    Foo<ADer>();

    return 0;
}
...