【发布时间】:2017-03-02 13:11:47
【问题描述】:
我的目标是拥有一个具有各种别名的模板化 Wrapper 类。这是一个简化的预览:
template < typename Type >
class Wrapper {
public:
Wrapper(Type* resource) : ptr(resource) {}
~Wrapper() { free(ptr); }
private:
Type* ptr;
}
void free(SDL_Window* ptr) { SDL_DestroyWindow(ptr); }
void free(SDL_Renderer* ptr) { SDL_DestroyRenderer(ptr); }
using Window = Wrapper<SDL_Window>;
using Renderer = Wrapper<SDL_Renderer>;
我希望只允许创建 Wrapper 类的这些别名实例。原因之一是它是 SDL 资源指针的包装器,它具有不同的内存释放功能,具体取决于指针的类型。
我想实现的最佳方案是使 Wrapper 类在我创建的别名的使用之外不可见。也许有一个使用匿名命名空间的解决方案,但是解冻意味着包装类不能在头文件中。
【问题讨论】:
-
要么放置一个带有用户友好消息的静态断言,要么在实现文件中定义类模板的成员函数,并且只为类型的首选子集隐式实例化
-
我也尝试过 static_assert 但我收到一个错误,即 typeid(Type) == typeid(SDL_Window) 不是常量表达式
-
你需要
std::is_same<Type, SDL_Window>::value,或者使用一些模板机制,比如 boost mpl list 或者你的自定义实现 -
好的,用 is_same 语句填充的 static_assert 可以工作。还有没有办法完全隐藏 Wrapper,而只看到定义的别名?
-
您至少需要将声明放在头文件中,并显式实例化模板类
标签: c++ templates c++14 anonymous-class