“对重载函数的模糊调用”

时间:2014-09-19 08:12:40

标签: c++ inheritance overloading

我有一个这样的结构,结构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子句来解决这个问题。

1 个答案:

答案 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)
  { /* ... */ }
};

Live example