gpt4 book ai didi

c++ - 类的映射函数

转载 作者:行者123 更新时间:2023-11-30 01:00:56 25 4
gpt4 key购买 nike

在我尝试映射我的类和命名空间之前,通过使用静态调用我成功了,现在我需要映射我的类的函数,因为它们将被动态使用。

首先,我想在构造函数中进行硬编码,这样我就可以分配一个 std:map,其中函数名称的字符串指向函数本身。

例如:

class A{
int B(){
return 1;
}
};

int main(){
A *a = new A();
vector<string, int (*)()> vec;

vector["A.B"] = a.B;
}

通过将函数 B 映射到 A 类,我知道我只将函数映射到实例,而 B 不是静态的,无法全局映射。

但这就是我所需要的,在某个时候有人会给我一个字符串,我必须调用类实例的正确函数。

我的问题是我是否只能通过在构造函数中硬编码来做到这一点,因为这是我们正在讨论的实例范围,或者是否有某种方法可以在函数声明中做到这一点,就像这里的命名空间和类:

Somehow register my classes in a list

最佳答案

如果我没理解错的话,您希望 map 存储一个指针,该指针可用于调用实例上的成员函数,该值是在运行时从 map 中选择的。我假设这是正确的做法,并且没有更简单的方法来解决同样的问题。很多时候,当您最终陷入奇怪的 C++ 死水时,这表明您需要重新审视您认为遇到的问题,看看这是否是解决问题的唯一方法。

使用普通函数指针的问题是非静态成员函数不是普通函数。假设您可以使用普通函数指针指向一个成员函数,那么当您取消对该指针的引用并调用该函数时会发生什么?成员函数需要一个对象来操作,语法没有提供传递这个对象的方法。

您需要一个指向成员的指针,这是一个稍微晦涩难懂的功能,语法相对棘手。普通指针抽象对象,而指向成员的指针抽象类中的成员;指针指定应调用哪个类成员,但不指定从哪个对象获取成员(将在使用指针时指定)。我们可以像这样使用它:

class B;

class A
{
B some_function()
{ /* ... */ }
};


B (A::* myval)() = A::some_function;

这里的 myval 是一个变量,指示类 A 的成员之一,在本例中为成员 some_function(尽管它可以指向 A 的任何其他相同类型的成员)。我们可以在任何我们想要的地方传递 myval round(例如,将其存储在 STL 容器中,如您的示例中所示),然后当我们想要调用该函数时,我们指定应该调用它的实例以定位该函数:

A some_a;

B newly_created_b = (some_a.*myval)();

这适用于特定情况,但不能解决您的一般问题,因为成员指针包含它们作为定义的一部分引用的。即下面两个变量是完全不同的类型:

B (Foo::* first_variable)() = Foo::some_function;
B (Bar::* second_variable)() = Bar::some_function;

即使两个函数在不带参数的情况下调用时都可以生成 B,但这两个值在不同的类上运行,因此您不能将一种类型的值分配给另一种类型的变量。这当然排除了将这些不同类型存储在单个 STL 容器中的可能性。

如果您致力于将这些存储在容器中,则必须采用像 Charles Salvia 提议的基于仿函数的解决方案。

关于c++ - 类的映射函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1786809/

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