为模板参数提供帮助

Edw*_*nge 7 c++ templates friend

为模板参数提供参与是不可能的,因为标准不允许这样做.那我怎么能有效地做同样的事呢?

我想要的基本上是一种在拥有它的对象之外无法使用的类型.为什么不是重点,但如果你真的必须知道,我正在尝试制定一套智能指针来解决共享自有资源的问题.因此,我想要做的就是这样,如果它有效:

template < typename T, typename Owner >
struct accessible_member
{
private:
  accessible_member() : val(T()) {}
  accessible_member(T const& t) : val(t) {}

  operator T& () { return val; }
  operator T const& () const { return val; }

  member_ptr<T> operator & () { return member_ptr<T>(val); }

  friend class Owner;
};
Run Code Online (Sandbox Code Playgroud)

因此,一个类不能将该对象保存为成员,除非它声明自己是所有者,并且如果它足够愚蠢地按原样公开它,那么在类之外使用这么愚蠢是不可能的.

How*_*ant 5

你对C++ 98/03是正确的.但是C++ 0x(n3225 11.4/3)允许您使用以下语法执行此操作:

friend Owner;
Run Code Online (Sandbox Code Playgroud)

看看你的编译器是否允许你这样做.尝试启用C++ 0x支持.否则解决方法更加丑陋:

struct Owner
{
    typedef Owner self;
};
Run Code Online (Sandbox Code Playgroud)

...

然后根据您的编译器之一:

friend typename Owner::self;
Run Code Online (Sandbox Code Playgroud)

要么:

friend class Owner::self;
Run Code Online (Sandbox Code Playgroud)


Yoc*_*mer 3

您可以使用它,然后让所有所有者继承Owner

然后,您可以使用Owner类来私有包装accessible_member中使用的方法 。所有者现在可以访问
accessible_member。Friend 不是继承的,因此您可以提供(包装)必要的方法,以便所有继承 Owner 的类都可以使用accessible_member

这是一个 2 级解决方案,但它保持了封装级别。

template < typename U >
struct Owner 
{
   protected:
   accessible_member<U> newAccessible_member() { return accessible_member<U>(); }
   accessible_member<U> newAccessible_member(U const& u) { return accessible_member<U>(u); }
   .....

};

template < typename T >
struct accessible_member
{
private:
  accessible_member() : val(T()) {}
  accessible_member(T const& t) : val(t) {}

  operator T& () { return val; }
  operator T const& () const { return val; }

  member_ptr<T> operator & () { return member_ptr<T>(val); }


  template < typename U> friend class Owner;
};
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用受保护的方法在从 Owner 继承的结构中间接使用accessible_member:

struct Blah: Owner<int>
{
   void Dosomething() {
       accessible_member<int> blah= newAccessible_member();
   }
};
Run Code Online (Sandbox Code Playgroud)

查看Template Friends中的最后一个示例。