C++:如何在没有&符号的情况下通过指针调用?

C++: How to call by pointer without ampersand?

如何在我传入结构的函数调用中不使用&符号的情况下通过指针调用函数。我只能编辑函数定义,不能编辑函数的调用方式。可以使用引用调用,但我想通过指针调用,有什么办法吗?

void Some_Func(struct TheStruct &My_struct){
     My_struct->member = 4;  // Would like to do this! 
}

int main(){
Some_Func(My_Struct);
}

我 90% 确定这不是你要找的答案,但我会 post 无论如何,剩下的 10% 的疑问:

看看std::addressof(T&)。它为您提供了指针而不使用&符号。

老实说,我认为这个问题是由一些误解引发的....假设您有这个(工作)代码:

struct TheStruct { int member;};
void Some_Func(struct TheStruct &My_struct){
     // some implementation
}

int main(){
    TheStruct x;
    Some_Func(x);
}

你说

I can only edit the function definition, not the way the function is being called.

...因此无法使函数将指针作为参数。如果在 main 中有一个实例(不是指针)作为参数传递并且您不允许更改 main,那么您不能神奇地使参数成为指针。

在函数内部使用->的唯一方法是

void Some_Func(struct TheStruct &My_struct){
    TheStruct* x = &MyStruct;
    x->member = 4;
}

但是,没有理由这样做(除非键盘上的 . 坏了),而且它会使代码难以阅读。

这会起作用。

struct TheStruct {
    int member;
};

void Some_Func(TheStruct &My_struct){
    My_struct.member = 4;
}

int main(){
    TheStruct My_Struct;

    My_Struct.member = 5;
    std::cout << My_Struct.member << std::endl;

    Some_Func(My_Struct);
    std::cout << My_Struct.member << std::endl;

    return 0;
}

输出:

5

4

通过引用访问对象时,必须使用.运算符来访问其成员:

void Some_Func(TheStruct &My_struct) {
    My_struct.member = 4;
}

int main() {
    TheStruct My_struct;
    Some_Func(My_Struct);

    // or:
    // TheStruct *My_struct = new My_struct;
    // Some_Func(*My_Struct);
    // delete My_struct;
}

当通过指针访问对象时,您必须使用->*.运算符来访问其成员:

void Some_Func(TheStruct *My_struct) {
    My_struct->member = 4;
    // or (*My_struct).member = 4;
}

int main() {
    TheStruct My_struct;
    Some_Func(&My_Struct);

    // or:
    // TheStruct *My_struct = new TheStruct;
    // Some_Func(My_Struct);
    // delete My_struct;
}

如果不想使用&运算符获取对象变量的地址(可能是因为C++11及以后的it overrides operator&, for instance), you can use std::addressof()

int main() {
    TheStruct My_struct;
    Some_Func(std::addressof(My_Struct));
}

或使用boost::addressof:

#include <boost/utility.hpp>

int main() {
    TheStruct My_struct;
    Some_Func(boost::addressof(My_Struct));
}

或手动实施addressof()

template<class T>
T* my_addressof(T& arg) 
{
    return reinterpret_cast<T*>(
        &const_cast<char&>(
            reinterpret_cast<const volatile char&>(arg)
        )
    );
}

int main() {
    TheStruct My_struct;
    Some_Func(my_addressof(My_Struct));
}