2017-08-31 47 views
1

我有一个具有重载方法的类。某个子类继承这两种类型。是否可以设置一个默认的方法调用,以避免调用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 
} 

有什么办法可以让编译器默认的某些方法调用?

*接受了聪明/优雅的解决方法。

+2

如何声明'void foo(const C)'以便它可以调用默认值? – wally

+0

对不起,foo是一个超类的方法调用,C是一个子类。我将编辑我的问题来展示这一点。 –

+0

也许在发布之前尝试编译您的示例。有很多语法错误,现在的问题令人困惑,因为如果它是一个成员函数,foo不能被这样调用。 – wally

回答

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

+0

投票选出最佳,最好的工作。没有意识到你可以在不使用钻石托架的情况下以这种方式使用模板。我正在写一个数学库(带有运算符),因此不需要static_cast或<>对于干净的符号目的来说是非常棒的。 谢谢 –