C++成员操作符的enable_if(或解决方法)
template<typename T>
struct foo
{
T* p;
foo(T* x) : p(x) {}
~foo() { if(p) delete p; }
T& operator*() const { return *p; }
};
int main()
{
foo<int> i(new int);
foo<void> v(new int); // <= illegal use of type 'void'
}
如果 T = void 那么我不想实现运算符*()。我怎样才能实现这个目标?我不想专门化这个类,因为我的类中有很多其他方法。
PS:请注意,这只是一个解释我的问题的例子。
template<typename T>
struct foo
{
T* p;
foo(T* x) : p(x) {}
~foo() { if(p) delete p; }
T& operator*() const { return *p; }
};
int main()
{
foo<int> i(new int);
foo<void> v(new int); // <= illegal use of type 'void'
}
If T = void then I don't want to implement the operator*(). How can I achieve this? I don't want to specialize the class, because there are many other methods in my class.
PS: Please note that this is just an example to explain my issue.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
您可以将所有其他方法(与
T==void
配合良好)移至基类中,并让foo
从它派生。然后foo
可以专门化为不声明T==void
的operator*
You can move all the other methods (which play well with
T==void
) into a base class and makefoo
derive from it. Thenfoo
can be specialized to not declare theoperator*
forT==void
C++11 标准为
std::unique_ptr
解决了这个问题,如下所示:The C++11 standard solved this for
std::unique_ptr
like so:像这样:
Like that:
怎么样?
我在这里遗漏了一些明显的东西
How about
or am I missing something obvious here?
这个解决方案有何特点:
What's about this solution: