c++ - 通过覆盖类型转换动态调用函数

标签 c++ operator-overloading c++03

#include <iostream>

using namespace std;

class Base
{
public:
  void who()
  {
    cout << "I am " << _name << endl;
  }

protected:
  std::string _name;
};

class A : public Base
{
public:
  A()
  {
    _name = "A class";
  }
};

class B : public Base
{
public:
  B()
  {
    _name = "B class";
  }
};

class Wrapper
{
public:
  Wrapper(Base *i):_data(i)
  {
  }

  operator A()
  {
      A a;
  //  dynamic_cast<A*>(_data);
      return a;
  }

  operator B()
  {
      B a;
   // dynamic_cast<B*>(_data);
      return a;
  }
private:
  Base* _data;
};

void madeForClass(A iObject)
{
  cout << "call madeForClass A";
}

void madeForClass(B iObject)
{
  cout << "call madeForClass B";
}

int main()
{
  A a;
  Base* b = &a;

  madeForClass(Wrapper(b));

  return 0;
}

当我执行这个时,我从编译中得到错误说: 错误错误:重载“madeForClass(Wrapper)”的调用不明确 我知道即使我重载了类型转换,它也无法推断出正确的功能。但是,我怎样才能获得这样的活力呢?

有关更多信息,我想以某种方式在重载函数中或某处使用 dynamic_cast,以便根据转换的结果选择相应的 madeForClass 函数。

对于给定的示例,“B”的转换将失败,因此应该调用 madeForClass(A i);

最佳答案

或者,你可以这样做

class Wrapper
{
public:
    Wrapper(Base *i) : _data(i) {}

    template <typename F>
    auto Apply(F f)
    {
        if (auto a = dynamic_cast<A*>(_data)) {
            f(*a);
        } else if (auto b = dynamic_cast<B*>(_data)){
            f(*b);
        }
    }

private:
  Base* _data;
};

然后

Wrapper(base).Apply([](const auto& e){ madeForClass(e); });

Demo

或使用 Visitor 而不是手动 dynamic_cast

关于c++ - 通过覆盖类型转换动态调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37859667/

相关文章:

c++ - 如何对 vector 进行二进制搜索以查找具有特定 id 的元素?

c++ - 检测哪个 USB 设备生成了输入

c++ - 局部变量作用域问题

c++ - CUDA 驱动 CUmodule

C++,打印输出 (<<) 运算符重载

c++ - 箭头-> 运算符重载如何在 C++ 内部工作?

c++与运算符<<和[]的类型混淆

C++ 替代模板化数据成员

带有 C++11 源代码的 C++03 库

c++ - Qt:如何判断一个widget在QScrollArea中是否可见?