使用C ++中的重载分辨率在运行时选择一个函数

问题描述

我有一个类的方法(在下面的示例中,bar中的app)。我想让方法自动调用,我的意思是没有条件语句(如if,重载函数(示例中为create)。 在编译时无法知道要调用哪个函数,因为该函数依赖于硬件输入(本示例中为用户输入)。 在我的示例中,无法更改基类b以及派生类d1d2。在实际代码的上下文中,它们基本上是硬件驱动程序的一部分。

#include <iostream>

class b
{
 virtual void foo() = 0;
};

class d1 : public b
{
 void foo() override {};
};

class d2 : public b
{
 void foo() override {};
};

class app
{
 int create(d1 & p1){return 1;}
 int create(d2 & p2){return 2;}
 public:
 app()
 {
 }
 void bar(b * p)
 {
  ::std::cout<<this->create(*p)<<::std::endl;
 }
};

int main()
{
 b * either1or2;

 auto input(0);
 ::std::cin>>input;
 if(input % 2 == 0)
 {
  either1or2 = new d1;
 }
 else
 {
  either1or2 = new d2;
 }
 
 app a;
 a.bar(either1or2);
 return 0;
}

我写的东西是错误的,因为它在编译时需要知识。

::std::cout<<this->create(*p)<<::std::endl;

应该更像是

::std::cout<<this->create(*dynamic_cast< decltype(*p) * >(p))<<::std::endl;

但是会出现同样的问题,因为在编译时评估了decltype。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...