函数返回类型重载C++



我已经读到,只能按参数类型重载函数,而不能按返回类型重载函数。

最近我试着学习如何使用<filesystem>

在这里,我发现current_path();函数的返回类型为path,但如果你像这样调用它current_path(path('path/to/a/directory'));,它会更改你的CWD并返回void

问题

  • 有可能这样做吗,还是只是网站提供了虚假信息
  • 如果可能的话,我怎么能自己做呢
  • 我是C++新手,所以用初学者能理解的方式来解释

是否可以进行

是的,这是可能的。不同的重载可以有不同的返回类型。

不同重载之间的返回类型也可以相同,但不同重载之间参数列表不能相同。

还是只是网站提供了虚假信息?

链接的文档是正确的。

如果可能的话,我怎么能自己做呢?

与所讨论的标准重载函数的方式相同。这里有一个最小的例子:

int foo();     // 1
void foo(int); // 2
int i = foo(); // calls 1
foo(i);        // calls 2
void foo(); // NOT OK
// same parameter list as 1
// but different return type

不能仅基于返回类型进行重载。简而言之,编译器会根据参数计算出要调用的重载。因此,您无法在返回类型上区分两个仅基于的重载

int f() { return 42; }
double f() { return 3.14; }       // error redeclaration of f()
f();   // calls what function ?!?

当参数类型不同时,两个重载可以有不同的返回类型:

int g() { return 42; }          // (1)
double g(int) { return 3.14; }  // (2)
g();  // calls (1)
g(1); // calls (2)

虽然香草重载不允许你只根据返回类型进行重载,但有一个巧妙的技巧可以模仿它

上述f重载会导致编译器错误,因为它们不是有效的重载集(仅因返回类型不同(。但我们可以定义两个独立的函数:

int f_int(){ return 42; }    
double f_double() { return 3.14; }

我们可以定义一个类型,其目的无非是可以转换为intdouble。在转换过程中,我们可以调用相应的f_x:

struct foo {
operator int() { return f_int(); }
operator double() { return f_double(); }
};

现在这两条线:

int x = foo{};
double y = foo{};

根据我们分配的内容,分别调用f_intf_double

现场演示

不过,请对此持谨慎态度。很少实际需要仅基于返回类型重载。当上下文中不清楚发生了什么时,这两条线可能会相当模糊。隐式转换总是一个混乱的来源。最后但最不重要的是,它也不太符合";几乎总是自动的";。

相关内容

  • 没有找到相关文章

最新更新