R>Тем, не менее, не смотря на кажущуюся (мне, по крайней мере) бессмысленность этого кода, предложенный ниже вариант по своему эффекту полностью идентичен исходному.
R>R>int main()
R>{
R> struct
R> {
R> int result_code;
R> int foo::*field;
R> } cases[] = {
R> {1, &foo::foo_a},
R> {2, &foo::foo_b},
R> {3, &foo::foo_c},
R> };
R> const int cases_count = sizeof(cases) / sizeof(*cases);
R> barstruct bar;
R> char * buf;
R> if (fillbuff(buf) == 0)
R> return 0;
R> for (int i = 0; i < cases_count; ++i)
R> if (fillbuff(buf) == cases[i].result_code)
R> {
R> foo * f = bar.get_foo( bar.c );
R> if(!f)
R> break;
R> return f->*cases[i].field;
R> }
R>}
R>
Привиденный пример синтетический, просто для того чтобы показать от чего хочется избавится. Здесь интересует прежде всего не оптимизация, а какими путями можно избавится от макроса. Учитывая что во время работы fillbuff динамически создаются различные структуры в barstruct и их количество не известно при компиляции.