CRTP-我可以做私人方法吗?
CRTP - Can I make a private method?
我正在实现静态多态性:
template<typename T>
class Base {
public:
void method() {
// do something
impl();
// do something else
}
void impl() { // intended to be private
static_cast<T*>(this)->impl();
}
};
class Derived : public Base<Derived> {
public:
void impl() { // intended to be private
}
};
此代码是动态多态性类的静态实现,其中void stramp((是虚拟和私有的。
我已经实现了多态性(静态(。但是我必须将方法void nmpl((公开以允许从基类访问它。我希望method void inmand((再次成为私人。可以做吗?
更新:我不想写
friend class Base<Derived>;
在派生类中,因为它允许基础访问派生的所有成员。
在您的Derived
类中添加一行:
class Derived : public Base<Derived> {
public:
private:
void impl() { // intended to be private
}
friend class Base<Derived>;
};
将把基类指定为朋友,允许我以impl
为私有编译代码。
编辑
@oliv在评论中建议的,律师 - 委托人成语的实现看起来像:
template<typename T>
class Attorney;
template<typename T>
class Base {
public:
void method() {
// do something
impl();
// do something else
}
private:
void impl() { // intended to be private
Attorney<T>::impl(*static_cast<T*>(this));
}
};
class Derived : public Base<Derived> {
private:
void impl() { // intended to be private
}
friend class Attorney<Derived>;
};
template<typename T>
class Attorney {
private:
friend class Base<Derived>;
static void impl(Derived & c) { // add additional parameters as needed by impl
c.impl();
}
};
相关文章:
- 我可以让编译器忽略特定于操作系统的方法吗?
- 如何将 c++ 类包装到 python 中,以便我可以使用 pybind11 访问其成员的公共方法(成员是一个对象指针)
- 为什么我可以调用一个从const方法更改成员的方法
- 如果我从不调用这个方法,我可以把static_assert放在类方法中吗
- 为什么我可以通过SubBase类的公共继承方法打印出基类的私人继承成员
- 有效创建数字签名的正确方法是什么?我可以使用DSA_sign_setup()吗?
- 我可以制作一个对象方法,如果单独调用,它将自行修改,但如果在复制初始化期间调用,则会返回一个新对象?
- 我可以从静态基方法获取当前类类型 ID 吗?
- CRTP-我可以做私人方法吗?
- 我不允许更改变量的声明,我可以编辑哪些其他方法
- 调用该方法时,我可以设置类实例
- 我可以使用什么方法或方式将用户输入的字符串转换为 C++ 中的整数
- C++多重继承 - 相同的方法名称 - 我可以以某种方式删除其中一个吗?
- 我可以在外部组装(function.asm)中制作C 方法吗?
- extern可以解决这个问题吗,或者我可以通过其他方法解决这个问题吗?
- 谁能想到一种方法,我可以错误地检查此问题
- 将特征矩阵转换为 c 数组以便我可以使用 gsl 的性能高效方法是什么
- 我可以有一个仅使用工厂方法创建的成员变量吗?
- 是否有任何方法我可以删除条目从ldap使用openldap调用
- 是否有任何方法我可以告诉我的代码正在编译与cl.exe