对齐指针以具有功能性 -> 运算符?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() 相同

如果你想重载->,你也应该重载*

最新更新