如何执行此函数调用

Posted

技术标签:

【中文标题】如何执行此函数调用【英文标题】:How to perform this function call 【发布时间】:2019-06-20 23:03:30 【问题描述】:

给定两个操作数

Eigen::Quaterniond eigen_quat;  
tf::Quaternion tf_quat;

还有功能

void tf::quaternionEigenToTF (const Eigen::Quaterniond &e, tf::Quaternion &t)

你如何执行函数调用?

我正在寻找一个简单的代码行,作为如何执行函数调用的示例;现在有点困惑 *,&, const 等。随意编辑问题标题。

提前谢谢你

【问题讨论】:

应该像quaternionEigenToTF( eigen_quat, tf_quat )一样简单 【参考方案1】:

& 是什么?

在函数签名中,& 字符表示它通过引用获取该参数。这很有用,因为它允许代码避免复制大值,或者因为您想修改函数中的值。例如:

void addOne(int& i) 
    i += 1; 


int main() 
    int x = 10; 

    addOne(x); // increments x by one
    
    std::cout << x << std::endl; // Prints 11

因为我们引用了x,所以在函数内部修改x时,x的原始值也被修改了。

const 是什么?

当一个变量被声明为const,这意味着你不能修改它。例如:

const int x = 5;

x = 6; // ERROR: can't modify a const variable

如果您有const 引用,则表示它是对变量的引用,但您不能通过该引用修改变量。例如:

int x = 4;

x++; // It's fine to modify x

const int& x_ref = x; // Get a const reference to x

x_ref++; //Can't modify x_ref: x_ref is const

为什么使用 const ref 作为函数参数?

当您有一个复制成本很高的对象时,您应该使用 const 引用作为函数参数,但您想保证它不会被您传递给它的函数修改。

您提供的函数通过 const 引用获取 Eigen::Quaterniond,避免复制,但向用户保证 Eigen::Quaternoind 对象不会被函数修改。

void tf::quaternionEigenToTF (const Eigen::Quaterniond &e, tf::Quaternion &t)

我怎么称呼它?

您可以像调用任何其他函数一样调用它:

igen::Quaterniond eigen_quat;  
tf::Quaternion tf_quat;

// Call the function
tf::quaternionEigenToTF (eigen_quat, tf_quat); 

【讨论】:

关于引用的更多信息:C++ 引用不是变量。它是现有变量的另一个名称,因此与传递包含另一个变量地址的变量的指针不同,引用是另一个变量。 感谢您的精彩和极其简单的解释【参考方案2】:

一个参考 - & - 就好像你给两个变量一个相同的棒的不同端。它们看起来不同,但实际上是相同的东西。您可以像使用普通变量一样使用它:

    int var10;
    int & same_var = var; // Reference to var
    std::cout << same_var << std::endl; // Prints 10
    same_var += 10; // Both same_var and var get modified,
                    // as they're both sharing the same state
    std::cout << same_var << std::endl; // Prints 20

一个指针 - * - 这个坏男孩是一个新的内存块,它包含它所指向的东西的地址。您可以通过取消引用来获得它所指向的对象的引用 (&):

    int var 1;
    int * ptr = &var; // Take the address of var, store it in a pointer
    std::cout << *ptr << std::endl; // Dereference the pointer - prints '1'

现在您可以看到我们是如何创建指针和引用的,您可以看看调用这个函数。

void tf::quaternionEigenToTF (const Eigen::Quaterniond &e, tf::Quaternion &t)

这个函数有 2 个参数,一个 const Eigen::Quaterniond 引用和一个 tf::Quaternion 引用。

这两个对象都是引用,所以正如我们在上面看到的,它们是相同对象的不同名称,在你的例子中是 eigen_quat 和 tf_quat。

const 限定符意味着函数承诺不会编辑您传入的对象的状态(编译器通过不允许它调用 const 对象上的任何非 const 成员函数来强制执行此操作)。

让我们开始吧!

通过从0x499602D2's 做一些复制粘贴魔法回答:

quaternionEigenToTF( eigen_quat, tf_quat )

我们可以通过将两个对象作为参数传递来轻松调用此函数。引用部分是魔法发生的!

【讨论】:

以上是关于如何执行此函数调用的主要内容,如果未能解决你的问题,请参考以下文章

如何运行多个异步函数然后执行回调?

C语言中如何实现按任意键退出

如何在运行时阻止forEach循环不执行两次?

如何强制调用某些构造函数/函数以使用命名参数?

以同步方式执行异步调用

如何快速调用此函数?