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

时间:2019-05-09 17:56:50

标签: c++ c++11 templates c++17

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

答案 0 :(得分:10)

您可以仅使用特征类来派生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;
};