我有一个这样的结构,结构Baz继承自2个不同的结构,Foo和Bar。
我有2个方法叫做同一个东西,一个参数为Foo,另一个参数为Baz。
struct Foo
{
};
struct Bar
{
};
struct Baz : Foo, Bar
{
virtual void something(const Foo& foo)
{
};
virtual void something(const Bar& bar)
{
};
};
我称之为
Baz baz;
baz.something(baz);
可以理解的是,如果我传递一个Baz实例,我的代码知道我正在调用哪个函数。我得到“对重载函数的模糊调用”。
我知道我可以将我的Baz投射到Foo或Bar来解决问题......
Baz baz;
baz.something((Bar)baz);
...但是还有另一种处理这个设计问题的方法吗?
如果传递的对象不是Bar类型,我想调用Foo方法。
编辑:
如果这是C#(它不是),我可以使用模板where子句来解决这个问题。
答案 0 :(得分:2)
首先,请注意您使用的演员表会创建一个临时对象。你可能意味着这个:
baz.something(static_cast<Bar&>(baz));
要回答你的问题,应该可以使用SFINAE:
struct Baz : Foo, Bar
{
virtual void something(const Bar &bar)
{ /* ... */ }
template <
class T,
class = typename std::enable_if<
std::is_convertible<const T&, const Foo&>::value &&
!std::is_convertible<const T&, const Bar&>::value
>::type
>
void something (const T &foo)
{ something_impl(static_cast<const Foo&>(foo)); }
private:
virtual void something_impl(const Foo &foo)
{ /* ... */ }
};