如何执行此函数调用

How to perform this function call

给定两个操作数

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

和函数

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

你是如何进行函数调用的?

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

提前致谢

什么是&

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

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); 

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

    int var{10};
    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 对象上的任何 non-const 成员函数来强制执行此操作)。

那么让我们进入正题吧!

通过 0x499602D2's 的一些 copy-paste 魔法来回答:

quaternionEigenToTF( eigen_quat, tf_quat )

我们可以通过将两个对象作为参数传递来轻松调用此函数。 reference-taking 部分神奇地发生了!