【发布时间】:2015-08-06 04:54:41
【问题描述】:
考虑这段代码:
#include <iostream>
class A {
public:
template <typename... Args> void execute(Args&&... args) {foo(std::forward<Args>(args)...);}
template <typename... Args> void doIt(Args&&... args) {bar(std::forward<Args>(args)...);}
private:
void foo() {}
void foo(int) {}
void foo(int, char) {}
void foo(bool, int, double) {}
void bar() {foo();} // *** Added
void bar(int) {}
void bar(int num, char c) {foo(num, c);} // *** Added
void bar(bool, int, double) {}
};
int main() {
A a;
a.doIt();
a.doIt(5,'t');
}
A::doIt 将具有与A::execute 相同的重载类型,并且将对其中一些使用bar 的重载(其中 bar 的重载是唯一的),并为其他使用foo 的重载。为此,我简单地添加了void bar() {foo();} 和void bar(int num, char c) {foo(num, c);}。这不是那么痛苦,但假设有很多这样的转发要做。并在需要 doIt 的新重载时考虑维护问题,并为它们定义新的 foo 重载(容易忘记转发的东西)。
有没有办法删除这些额外的bar 重载(只需转发到foo),而是修改当前定义的doIt(Args&&... args) 函数,以便在不存在此类条形重载的情况下调用@987654333 @的重载而不是?所以换句话说,删除我添加的两个bar 重载,由于doIt 的新定义,main() 仍然可以按预期编译。
【问题讨论】:
-
可能是部分专业化。
-
您的意思是使用 std::enable if、std::declval 等?如何处理所有参数类型?
-
这样的,是的。 SFINAE。 “如何处理所有的参数类型?” 你可能已经在做转发了。我现在不知道有现成的解决方案可以解决您的问题,但这是我会尝试查找的目录。
-
您可以将
A拆分为A_bar和A_foo,将所有bars 重命名为foo并让A_foo继承自A_bar。 -
如果你想走那条路,那么在
A_bar中添加using A_foo::foo;,否则A_foo中foo的声明被隐藏。
标签: c++ templates overloading