我已经读到,只能按参数类型重载函数,而不能按返回类型重载函数。
最近我试着学习如何使用<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; }
我们可以定义一个类型,其目的无非是可以转换为int
或double
。在转换过程中,我们可以调用相应的f_x
:
struct foo {
operator int() { return f_int(); }
operator double() { return f_double(); }
};
现在这两条线:
int x = foo{};
double y = foo{};
根据我们分配的内容,分别调用f_int
或f_double
。
现场演示
不过,请对此持谨慎态度。很少实际需要仅基于返回类型重载。当上下文中不清楚发生了什么时,这两条线可能会相当模糊。隐式转换总是一个混乱的来源。最后但最不重要的是,它也不太符合";几乎总是自动的";。