Пусть определит 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
, но я не думаю, что это мне поможет.
парсер - переменная:
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();
Вы можете сравнить указатели функций
if(p.buffer_push_strategy == buffer_push_strategy1)