gpt4 book ai didi

c++ - 模板组合和友元传递性

转载 作者:太空狗 更新时间:2023-10-29 23:01:47 25 4
gpt4 key购买 nike

我有包含私有(private)数据的容器和访问私有(private)数据的友元类:

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> {};

但是友元是不可传递的,组合访问者不能访问容器私有(private)数据。有没有办法在不为每个人公开容器私有(private)数据的情况下解决这个问题?

最佳答案

如果您只是将 class Accessor 声明为 class Containerfriend 会怎么样:

template<class T>
class Container {
template<class T1> friend class Accessor;
std::vector<T> _data;
};

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

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

template<class T, template<typename> class First = Accessor, template<typename> class Second = Accessor>
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);
}
};

LIVE DEMO

关于c++ - 模板组合和友元传递性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30368159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com