gpt4 book ai didi

c++ - 我的好友模板可以在其实例化中提及我的私有(private)成员吗?

转载 作者:行者123 更新时间:2023-11-30 03:42:46 25 4
gpt4 key购买 nike

我正在编写一个模板类,它采用类和该类中方法的名称。我必须这样做,因为即使我将用来实例化我的模板的各种类都有类似的方法,但方法名称因类而异。在某些情况下,所讨论的方法是私有(private)的。因此,我想通过友元声明来扩充此类类,以授予我的模板访问私有(private)方法的权限。

template<class T, int (T::*func)()>
class A {
public:
int count(T* p) { return (p->*func)(); }
};

class B {
public:
int funcPublic() { return 0; }
};

class C {
template<class T, int (T::*)()> friend class A;
private:
int funcPrivate() { return 0; }
};

typedef A<B, &B::funcPublic > AB; // works
typedef A<C, &C::funcPrivate> AC; // g++: "error: ‘int C::funcPrivate()’ is private"

访问控制似乎是在提及点(模板实例化)而不是在使用点进行检查。这是 C++ 的指定方式吗?我只是运气不好吗?

最佳答案

如果您可以修改您的类 C,您似乎可以按如下方式解决它:

class C 
{
private:
int funcPrivate() { return 0; }

public:
typedef A<C, &C::funcPrivate> value;
};

typedef C::value AC;

通过这种方法,您实际上不必也使用 friend 来扩充此类。

但是,如果该方法满足您的要求,请考虑提供适当的接口(interface)来调用该方法。

关于c++ - 我的好友模板可以在其实例化中提及我的私有(private)成员吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36635562/

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