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