【问题标题】:C++ Syntax for accessing operator () from a pointer to an object从指向对象的指针访问运算符 () 的 C++ 语法
【发布时间】:2015-12-28 04:51:24
【问题描述】:

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

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

在这个类的一个成员函数中,我想调用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);

【问题讨论】:

  • 您可以使用-&gt;,但坦率地说,为什么不存储创建的值呢?为什么要使用指针?
  • 这看起来非常好:在解引用表达式 *dis_p 周围加上括号,让它完全按照你的意愿去做。但是,除非在某些情况下 dis_p 可能需要为 NULL,否则您可以将指针替换为引用,并恢复您熟悉的语法。
  • 我认为你应该习惯这种在涉及指针的 C++(和 C)代码中常见的语法。否则,是的,远离它们,您将永远不会摘要此类arcane语法。 span>

标签: c++ pointers


【解决方案1】:

使用任一

(*dis_p)(*gen_p);

(如你所愿)或

dis_p->operator()(*gen_p);

然而,就我个人而言,我根本不会使用指针。而是

dis(gen);

会成功的(因为dis_p 指向disgen_p 指向gen)。

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

【讨论】:

    【解决方案2】:

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

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

    编译器将优化整个交易以成为(*dis_p)(*gen_p),因此没有运行时开销。

    另外,简单的(*dis_p)(*gen_p) 并没有什么问题,我不认为它有那么令人困惑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-18
      • 2011-05-09
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      • 2020-12-24
      • 1970-01-01
      相关资源
      最近更新 更多