替代班级内声明类型的别名

Alternative to declaring a type alias inside a class

本文关键字:类型 别名 声明      更新时间:2023-10-16

我正在使用另一个库中的类(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(

您可以使用特质类来得出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;
};