成员运算符的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,那么我不想实现operator *()。我该如何实现?我不想专门研究该类,因为我的课堂上还有许多其他方法。 PS:请注意,这仅是说明我的问题的示例。     
已邀请:
C ++ 11标准针对
std::unique_ptr
解决了此问题,如下所示:
typename std::add_lvalue_reference<T>::type
    operator*() const { return *p; }
    
您可以将所有其他方法(与
T==void
一起使用)移动到基类中,并使make4ѭ从中继承。那么
foo
就可以专门化为not3ѭ不声明
operator*
template <typename T>
struct foobase {

  T* p;
  foobase(T* x) : p(x) {}
  ~foobase() { if(p) delete p; }

};

template <typename T>
struct foo : foobase<T> {
  T& operator*() const { return *p; }
};

template<> 
struct foo<void> : foobase<void> {

};
    
像那样:
template<typename T>
struct foo_base
{
    T* p;
    foo(T* x) : p(x) {}
    ~foo() { if(p) delete p; }

    // other methods …
};

template<typename T>
struct foo : foo_base<T>
{
    T& operator*() const { return *p; }
};

template<>
struct foo<void> : foo_base<void>
{
};
    
怎么样
typename disable_if<is_void<T>, T>::type& operator* () const { return *p;}
还是我在这里缺少明显的东西?     
关于此解决方案:
template<typename T>
struct foo
{
    T* p;
    foo(T* x) : p(x) {}
    ~foo() { if(p) delete p; }

    template<typename U> struct impl { U& deref(U* p) { return *p; } };
    template<> struct impl<void> { void deref(void* p) { } };

    typename boost::conditional<std::is_void<T>::value, T, typename std::add_reference<T>::type>::type operator*() const
    {
        static_assert(!std::is_void<T>::value, \"illegal use of type \'void\'\");
        return impl<T>().deref(p); 
    }
};
    

要回复问题请先登录注册