检查函数指针类型

时间:2016-07-27 08:12:04

标签: c++ c pointers

让我们定义一个结构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功能的内容,但我认为这不会对我有帮助。

2 个答案:

答案 0 :(得分:0)

您可以比较函数指针

if(p.buffer_push_strategy == buffer_push_strategy1)

请参阅https://ideone.com/QQzL1c

答案 1 :(得分: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();