在类中声明类型别名的替代方法

Swe*_*odd 3 c++ templates c++11 c++17

我正在使用sf::Texture另一个库中的类()。我想获得在该类中声明类型别名的功能,例如:

class Texture
{
public:
    using ResourceId = TextureId;
    //...
}
Run Code Online (Sandbox Code Playgroud)

这样我就可以在我的代码中做到这一点:

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>
}
Run Code Online (Sandbox Code Playgroud)

但是,正如我提到的,Texture该类来自另一个库,因此我无法编辑其声明。

我试图在代码中将using sf::Texture::ResourceId = TextureId;其声明为,但它不起作用(无法解析符号ResourceId)。

那么,有没有一种替代方法可以在不添加ResourceId第二个模板参数的情况下获得相同的功能?

(使用C ++ 17)

Ala*_*les 10

您可以只使用trait类来派生,ResourceId并专门针对Texture。例如:

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

template <>
struct ResourceTypeTrait< Texture >
{
  using ResourceId = TextureId;
};
Run Code Online (Sandbox Code Playgroud)

然后,您可以执行以下操作:

template<class ResourceType>
class ResourceContainer
{
public:
    ResourceContainer();
private:
    ResourceType* resource_;
    typename ResourceTypeTrait< ResourceType >::ResourceId id;
};
Run Code Online (Sandbox Code Playgroud)