Альтернатива объявлению псевдонима типа внутри класса - PullRequest
3 голосов
/ 09 мая 2019

Я использую класс (sf::Texture) из другой библиотеки. Я хочу получить функциональность объявления псевдонима типа внутри этого класса, например:

class Texture
{
public:
    using ResourceId = TextureId;
    //...
}

чтобы я мог сделать это в своем коде:

enum class TextureId
{
    texture1,
    texture2 //..etc
}

template<class ResourceType>
class ResourceContainer
{
public:
    ResourceContainer();
private:
    ResourceType* resource_;
    typename ResourceType::ResourceId id; // <--- this will have TextureId type
                                          // when we create this object 
                                          // with <sf::Texture>
}

Однако, как я уже говорил, класс Texture из другой библиотеки, поэтому я не могу редактировать его объявление.

Я пытался объявить его в своем коде как using sf::Texture::ResourceId = TextureId;, но он не работает (невозможно разрешить символ ResourceId ).

Итак, есть ли альтернатива для получения той же функциональности без добавления ResourceId в качестве второго параметра шаблона?

(с использованием C ++ 17)

1 Ответ

10 голосов
/ 09 мая 2019

Вы можете просто использовать класс черты, чтобы получить ResourceId и специализировать его для Texture. например:

template < typename T >
struct ResourceTypeTrait
{
  using ResourceId = typename T::ResourceId;
};

template <>
struct ResourceTypeTrait< Texture >
{
  using ResourceId = TextureId;
};

Тогда вы можете сделать:

template<class ResourceType>
class ResourceContainer
{
public:
    ResourceContainer();
private:
    ResourceType* resource_;
    typename ResourceTypeTrait< ResourceType >::ResourceId id;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...