обнаружение виртуальных методов

У меня есть класс, который анализирует документ и вызывает производный класс, чтобы уведомить определенные события, найденные в потоке. Поскольку синтаксический анализатор должен обрабатывать кодировки и перезаписывать части документа в строки, я бы хотел избежать перезаписи, если виртуальный метод не был переопределен. псевдокод:

class Parser
{
virtual void Callback ( string )
{
// Do nothing
}
private:
void ParseFile()
{
// Parse the file in the files encoding
// Checks and more checks
// Found sth. So need to convert to a string a call the
// callback, but if there is no callback what's the point
// in wasting cycles?

if ( Callback ) // In the world of C we could check for a func pointer
Callback( /* with the string */ )
}
}
class User : public Parser
{
void Callback ( string )
{
// This string means sth. me
}
}
class NonUser : public Parser
{
// I don't care about Callback so I won't implement it
}

В C-коде мы написали бы функцию и передали бы указатель на эту функцию в реализацию. Внутренне это проверило бы, указывает ли указатель на что-то и вызвало бы это. Как можно реализовать то же самое с производными классами? то есть. проверьте, существует ли виртуальный метод в производном классе, прежде чем тратить время / циклы ЦП / память на создание строки, которая может даже не потребоваться.

Проверка времени компиляции, при условии, что она переносима, была бы идеальной, но я думаю, что это как-то связано с v-таблицами, поэтому проверка времени выполнения может также работать.

После дополнительных исследований стало очевидно, что v-таблиц нет, и это практически невозможно. Я немного изменю свой вопрос, чтобы спросить, возможно ли вышеизложенное, используя какой-то тип, может быть, шаблон, обман?

0

Решение

Вы можете сделать параметр std::futureи идти с простым производным подходом.

Или вместо строки передайте прокси или функцию, которая может это предоставить.

Или переверните таблицу, ничего не передавайте и используйте функцию-член в Base, которая возвращает строку так, как она будет создана.

Другой подход состоит в том, чтобы иметь функцию виртуального предиката для функции: в вашем базовом классе она возвращает false, другие возвращают true, поэтому вы можете вызвать ее до выполнения реальной работы. В качестве альтернативы он мог бы возвращать указатель на функцию для реализации, если это возможно в статической функции. (И это можно передать как еще один параметр …)

Было бы интересно почитать ваше исследование и сделать выводы из таблицы.

Шаблоны помогут вам, только если вы можете указать цель во время компиляции. Проблема, как вы заявили, подразумевает обработку информации, которая появляется только во время выполнения. И это требует некоторых указателей или другой информации, фактически переданной. Но вы можете придумать точное описание проблемы.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector