从指向对象的指针访问operator()的语法

C++ Syntax for accessing operator () from a pointer to an object

本文关键字:operator 语法 访问 指针 对象      更新时间:2023-10-16

我有一个c++ 11随机数分布的实例;uniform_int_distribution,以及一个c++ m19937_64算法的实例。

我将这两个using指针的引用传递给一个类,这个类维护一个指向这两个对象的指针,以供以后使用。

在这个类的一个成员函数中,我希望调用operator()函数从uniform_int_distribution中生成一个随机数。

我已经做了以下事情。(可能不正确,因此有这个问题。)

std::random_device rd;
std::mt19937_64 gen(rd());
std::mt19937_64 *gen_p = &gen;
std::uniform_int_distribution<int> dis(0, 9);
std::uniform_int_distribution<int> *dis_p = &dis;

然后我做以下操作:(在后面的代码中,在我的类成员函数中)

int random_number = (*dis_p)(*gen_p);

这看起来有点奇怪或模棱两可,或者至少对我来说是这样,因为我以前没有遇到过这种情况。

如果没有指针,可以这样做:

int random_number = dis(gen_p);

使用

(*dis_p)(*gen_p);

(as you are)或

dis_p->operator()(*gen_p);
然而,就我个人而言,我根本不会使用指针。而不是
dis(gen);

可以达到这个目的(因为dis_p点在dis, gen_p点在gen)。

可以在类中存储引用(尽管它们需要使用构造函数初始化,并且不能像指针那样重新定位)。

您也可以先将指针转换为引用:

auto& rDis = *dis_p;
auto& rGen = *gen_p;
rDis(rGen);

编译器会将整个协议优化为(*dis_p)(*gen_p),所以没有运行时开销。

同样,普通的(*dis_p)(*gen_p)也没有什么问题,我不认为这是令人困惑的。