模板组成和友谊传递性

时间:2015-05-21 08:16:04

标签: c++ templates refactoring friend

我的容器包含私有数据和访问私有数据的朋友类:

template<class T>
class Container
{
    friend typename T::MyAccessor;
    vector<T> _data;
};

template<class T>
class Accessor
{
public:
    void doSomething(Container<T> *c)
    {
        cout << c->_data.size() << endl;
    }
};

template<class T, template<typename> class CustomAccessor>
struct MyBase
{
    typedef Container<T> MyContainer;
    typedef CustomAccessor<T> MyAccessor;
};

现在我想以这种方式组合访问者:

template<
    template<typename> class First
    ,template<typename> class Second 
    ,class T
>
class Composite
{
public:
    typedef First<T> MyFirst;
    typedef Second<T> MySecond;

    void doSomething(Container<T> *c)
    {
        MyFirst a;
        a.doSomething(c);

        MySecond b;
        b.doSomething(c);
    }
};

template<class T>
class DoubleAccessor : public Composite<Accessor, Accessor, T> {};

但友谊不是传递的,组合访问者无法访问容器私有数据。 有没有办法解决这个问题而不为每个人公开容器私人数据?

1 个答案:

答案 0 :(得分:1)

如果您只是将class Accessor声明为friend的{​​{1}},该怎么办?

class Container

LIVE DEMO