为不明确的重载函数调用创建默认值
Posted
技术标签:
【中文标题】为不明确的重载函数调用创建默认值【英文标题】:Creating a Default for ambiguous overloaded function call 【发布时间】:2017-08-31 02:44:51 【问题描述】:我有一个具有重载方法的类。某个子类继承了这两种类型。是否可以设置一个默认的方法调用来避免调用static_cast<class>(obj)
struct A ;
struct B
void foo(const A)
/*impl*/
void foo(const B)
/*impl*/
;
struct C : A, B
;
int main()
C c;
B b;
b.foo(c); //ambiguous
有没有办法让编译器默认调用某个方法?
*接受聪明/优雅的变通方法。
【问题讨论】:
如何声明void foo(const C)
以便调用默认值?
抱歉,foo 是来自超类的方法调用,而 C 是子类。我将编辑我的问题以展示这一点。
也许在发布之前尝试编译您的示例。有很多语法错误,现在问题很混乱,因为如果 foo
是成员函数,就不能这样调用。
好的,修好了。
【参考方案1】:
您可以使用模板为您执行static_cast
,然后调用默认值:
struct A ;
struct B
template<typename T>
void foo(T& t)
foo(static_cast<A&>(t));
void foo(const A)
/*impl*/
void foo(const B)
/*impl*/
;
struct C : A, B
;
int main()
C c;
B b;
b.foo(c); //eventually calls foo(A)
但话说回来,声明一个接受C
的成员函数可能更容易。
【讨论】:
被选为最佳解决方案。没有意识到您可以在不使用菱形括号的情况下以这种方式使用模板。我正在编写一个数学库(带有运算符),因此不需要 static_cast 或 对于干净的符号目的来说非常棒。谢谢以上是关于为不明确的重载函数调用创建默认值的主要内容,如果未能解决你的问题,请参考以下文章