Проверка типа указателей на функции

1

Пусть определит parser структуры:

struct parser {
    int (*buffer_push_strategy)();
    int (*escape_buffer_push_strategy)();
    int (*do_callback_strategy)();
};

У меня есть функция инициализации:

int parser_init() {    
    if (some_condition) {
        parser->buffer_push_strategy = buffer_push_strategy1;
        parser->escape_buffer_push_strategy = escape_buffer_push_strategy1;
        parser->do_callback_strategy = do_callback_strategy1;
    }
    else {
        parser->buffer_push_strategy = buffer_push_strategy2;
        parser->escape_buffer_push_strategy = escape_buffer_push_strategy2;
        parser->do_callback_strategy = do_callback_strategy2;
    }
return 0;
}

где функции стратегии определены где-то.

Хорошо, поэтому я заинтересован в том, чтобы определить, какая стратегия была использована при написании модульных тестов. Есть идеи, как это сделать?

Я видел что-то в интернете о функции is_pointer из C++ 11, но я не думаю, что это мне поможет.

  • 0
    Парсер это тип, а не переменная. Удалите typedef в первом фрагменте кода.
  • 0
    @AntonioGarrido Да, извините
Показать ещё 3 комментария
Теги:
pointers

2 ответа

0
Лучший ответ

парсер - переменная:

struct parserT {
    int (*buffer_push_strategy)();
    int (*escape_buffer_push_strategy)();
    int (*do_callback_strategy)();
} parser;

Если вы хотите узнать, какая стратегия, вы можете использовать:

int strategy= (parser->buffer_push_strategy == buffer_push_strategy1) ? 1 : 2;

Возможно, вы предпочитаете хранить номер стратегии:

int parser_init() {    
    if (some_condition) {
        parser->buffer_push_strategy = buffer_push_strategy1;
        parser->escape_buffer_push_strategy = escape_buffer_push_strategy1;
        parser->do_callback_strategy = do_callback_strategy1;
        return 1;
    }
    else {
        parser->buffer_push_strategy = buffer_push_strategy2;
        parser->escape_buffer_push_strategy = escape_buffer_push_strategy2;
        parser->do_callback_strategy = do_callback_strategy2;
        return 2;
    }
}

Затем вы можете инициализировать синтаксический анализатор следующим образом:

const int STRATEGY= parser_init();
  • 0
    Отлично, спасибо!
0

Вы можете сравнить указатели функций

if(p.buffer_push_strategy == buffer_push_strategy1)

См. Https://ideone.com/QQzL1c

Ещё вопросы

Сообщество Overcoder
Наверх
Меню