C++函数接受指针和引用

cub*_*ube 1 c++ pointers overloading reference

我正在用C++编写一个库,并且有一些与模块一起工作的函数.一个例子看起来像这样:

void connect(Module *a, Module *b);
Run Code Online (Sandbox Code Playgroud)

问题是,如果函数接受也引用它有时会很方便(一些模块可能在堆栈上分配,一些模块在堆上,所有的&s和*s很快就会变得无聊和混乱).

现在我有内联函数,它接受引用,将它们转换为指针并调用原始函数.

inline void connect(Module &a, Module &b){
    connect(&a, &b);
}
Run Code Online (Sandbox Code Playgroud)

我不太喜欢这个解决方案,因为对于更多的函数,它会编写很多代码来编写,读取,编译,...

另一件正在考虑的事情就是增加Module::operator Module *()必须返回的东西this.

你对此有何看法?我错过了没有任何史诗般失败的可能吗?

谢谢.

Zif*_*fre 14

为什么不直接调用该函数

connect(&a, &b);
Run Code Online (Sandbox Code Playgroud)

就像你的内联函数一样,只要你用引用来调用它?这使得它非常清楚该功能将指针,并且ab不是指针.您只需要输入两个以上的字符.


Cha*_*tin 8

任何时候使用运算符重载,都会增加史诗失败的可能性.问题是知道你并不是*一个标准的指针操作符,但有人天真地阅读你的代码却没有.

最好的解决方案是返回并重构/重新考虑您的代码,因此您不需要两个接口进行相同的操作,


pet*_*hen 6

我不确定在你的情况下这是不是一个好主意,但一般来说,你可以使用一个参数适配器:

struct ModulePtrOrRef
{
  Module * m_p;
  Module(Module * p) : m_p(p) {}
  Module(Module & p) : m_p(&p) {}
}

void connect(ModulePtrOrRef a, ModulePtrOrRef b)
{
  connect_impl(a.m_p, b.m_p);
}
Run Code Online (Sandbox Code Playgroud)