对齐指针以具有功能性 -> 运算符?C++
Align A Pointer To Have A Functional -> Operator? C++
这个quesiton由两部分组成,第一部分与类中的->
运算符有关。它是否需要某种输入(根据C++标准)?例如
some_return_type? operator->( long address ) {
cast the address to some sort of pointer and do something with it...
return something?...possibly... maybe not?;
}
因此,实际上A::SomeMethod()
是指传递给->
的内存中函数的地址。或A::someStaticOrNonStaticDataMember
会引用字段的地址吗?
如果是这样(假设我们确实而不能访问类的实际类型),或者存在类似的东西,它是什么?我们可以根据关于类的一些信息为类重构指针的一部分,或者对齐指针,(或者用算法写一个类来做这件事),这样它就有了一个可操作的->
运算符,所以可以写:
somePointer->A::SomeMethod();
并让它调用A::SomeMethod()?也许可以为课堂上使用的内存创建上下文?
从注释中,您似乎想要控制编译器如何处理和生成->
令牌。这是不可能的,因为编译器不公开此类信息,标准也不要求这样做。
这就像你试图拥有"dynamic"(C#类型),但在C++中,不幸的是这是不可能的。类似的是包装某种由字符串(一种脚本语言)寻址的"闭包集合",但这会非常沉重,也不太好。
实际上,用您展示的语法做您想做的事情是不可能的。
如果对象的类型未知,则该对象隐藏在"void*"后面。这基本上意味着,使用该对象的唯一方法是将其强制转换回其原始类型。
假设您有一个DLL,它公开了2个函数(带有头文件)
// creates an object of given type or null_ptr if no object match
void* getObject(std::string obj_type);
// call a method on that object
void callMethod(void* obj, std::string method_name, void* args, void* returnval);
事实上,这个解决方案(即使很难看)允许对你不知道的对象调用方法(它可能比这要好得多)但这会迫使你使用空*和字符串。这是因为C++如何解析方法名称(事实上,在C#中,"动态"类型生成的幕后反射代码使用带有方法名称的字符串,并且速度特别慢)
因此,可以实现类似的功能
float fuelLiters = 3.0f;
void * myObj = createObject("SomeCar");
callMethod(myObj,"loadFuel", &fuelLiters, null_ptr);
你可能可以用模板或一些宏来使语法更好一点,但你永远无法做像这样的事情
myObj->A::loadFuel(fuelLiters);
你可以做的是让外部加载的类,使用与你的应用程序相同的接口,说:
class ICar{
public:
void loadFuel(float liters)=0;
};
在这种情况下,可以使用将不透明对象句柄强制转换为ICar的函数。这是我两年前在一个图书馆写的:
因此,您只需要DLL公开一个用于强制转换类(向下转换)的方法
//if given object is implementing a ICar, the correct pointer is returned, else
// this function will return nullptr (or throw exception if you like more)
void * downcast( typeof(ICar), myObj);
你只需要
ICar *myCar = static_cast<ICar>(downcast( typeof(ICar), myObj));
myCar->loadFuel(3.0f);
但是请注意,DLL和应用程序都应该"知道"什么是"ICar",因此它们必须包含"ICar"标头。
这样做肯定是可能的,我已经用了两种不同的方式,所以如果你需要更多关于实现的细节,我很乐意展示一种可能的方式(如果我正确理解你的问题)。
箭头运算符(->)是一个解引用运算符,专门用于指向具有成员的对象的指针foo->bar()
与(*foo).bar()
相同
如果你想重载->,你也应该重载*
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 布尔比较运算符是如何在C++中工作的
- 重载运算符new[]的行为取决于析构函数
- 是否需要使用 - &gt;运算符在C 中调用成员函数时