使用包装器类作为指向其包装的类型的指针
Using a wrapper class as a pointer to the type it wraps?
我有一个用于Integer类型的简单包装类,定义如下:
class Integer {
public:
Integer() {
}
Integer(const int& value) {
this->value = value;
}
int toInt() const {
return value;
}
operator int() const {
return toInt();
}
private:
int value = 0;
};
我想做的是,将上面的类传递给一个具有如下签名的函数:doSomething(int* value)
如果我使用一个普通的int,我可以简单地做:
int value = 5;
doSomething(&value);
然而,当使用包装类时,我不能,因为它会使用指向类的指针,而不是实际的底层值。我知道地址运算符operator&
,我可以使用它来返回指向该值的指针,但如果需要的话,它会阻止我获得指向类本身的指针。
因此,理想情况下,有一种方法可以让我使用&myclass
来获得指向类或底层值的指针,具体取决于需要什么。
有这样的办法吗?
我似乎能够解决自己的问题。
我从@Arunmu的一条评论和以下问题中获得了一些灵感:https://stackoverflow.com/a/9569120
通过重载operator&()
(的地址)运算符并返回一个代理类对象,该对象具有对原始类的类型及其包装的值的指针的隐式转换运算符,我可以使用所需的语法。
我将为任何遇到同样问题的人提供一个例子:
class IntegerPointer {
public:
IntegerPointer(int& value, Integer& wrapper) : value(value), wrapper(wrapper) {
}
operator int*() {
return &value;
}
operator Integer*() {
return std::addressof(wrapper);
}
private:
int& value;
Integer& wrapper;
};
class Integer {
public:
Integer() {
}
Integer(const int& value) : value(value) {
}
Integer(const Integer& value) : Integer(value.value) {
}
IntegerPointer operator&() {
return IntegerPointer(value, (*this));
}
protected:
int value;
};
这允许您使用语法,例如:
Integer test = 5;
doSomething(&test);
其中&test可以用作Integer对象的指针,也可以用作它包装的int值的指针。
相关文章:
- 如何在c++迭代器类型中包装std::chrono
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 包装C++类时不完整的类型 GLFWwindow
- 如何包装一个函数以适应另一个函数的所需类型
- 通过包装器从 C 访问C++ API 时,如何访问枚举类型
- 为 Sql 服务器实现 odbc 包装器.将数据库数据读取为字符或要求驱动程序将数据转换为 C 类型
- 有什么方法可以包装自动类型扣除的助推"tee"流的构造?
- 有没有办法将输入类型包装到C++中的模板类?
- 包装任意类型/非类型模板类的模板类
- 在 stl 容器包装器中定义迭代器类型
- 如何在 C++ 中正确包装类型
- 如何包装对象,使它们成为无法交互的单独类型?
- 包装一个函数,在 Cython 中返回复杂类型的向量
- 对类型的非常量左值引用 - 使用类类型的参数时,目标C++包装器中的错误
- 相同的枚举项在 SWIG > 2.0.1 中包装在不同类型的常量中
- Objective-C C++ 包装器 类型错误的不完整定义
- 包装类型的铸造
- 包装类型,但保留其有关函数重载的行为
- 根据Template参数包装类型的容器的Template类
- 在结构中包装类型会导致额外的填充