Выбор функции во время выполнения с использованием перегруженного разрешения в C

#c #inheritance #casting #runtime #dynamic-cast

#c #наследование #Кастинг #время выполнения #динамическое приведение

Вопрос:

У меня есть метод класса ( bar из app примера ниже). Я хочу, чтобы метод with вызывался автоматически, я имею в виду без условного оператора, например if , перегруженных функций ( create в примере). Какая функция для вызова не может быть известна во время компиляции, поскольку она зависит от аппаратного ввода (пользовательского ввода в примере). В моем примере базовый класс b и производные классы d1 и d2 не могут быть изменены. В контексте реального кода они в основном являются частью аппаратного драйвера.

 #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 amp; p1){return 1;}
 int create(d2 amp; 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 вычисляется во время компиляции.

Комментарии:

1. Понижающая обработка — это то, что вы редко хотите делать. Я не думаю, что вы можете делать то, что хотите, таким образом.

2. Я должен быть в безопасности в этом контексте, потому что понижение будет выведено по указанному значению. Но я согласен, что я не уверен, что это возможно, вот почему я спрашиваю ^^

3. Разрешение перегрузки всегда выполняется во время компиляции. Лучшее, что вы можете сделать во время выполнения, это выбрать между различными операторами для выполнения.