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)
因此,一个类不能将该对象保存为成员,除非它声明自己是所有者,并且如果它足够愚蠢地按原样公开它,那么在类之外使用这么愚蠢是不可能的.
你对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)
您可以使用它,然后让所有所有者继承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中的最后一个示例。
| 归档时间: |
|
| 查看次数: |
917 次 |
| 最近记录: |