Подделка статического оператора If в C++

Я тестирую комбинации различных оптимизаций, и для них мне нужен статический -if, как описано вhttp://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Static-If-I-Had-a-Hammerдля включения и отключения определенных оптимизаций. if (const -expr )не всегда работает, так как некоторые оптимизации включают изменение макета данных, а это невозможно сделать в области действия функции.

В основном я хочу вот этого:

template
class Algo{
  struct Foo{
    int a;
    if(enable_optimization){
      int b;
    }

    void bar(){
      if(enable_optimization){
        b = 0;
      }
    }
  };
};

(Да, меньший объем памяти при удалении b из макета данных актуален в моем случае.)

В настоящее время я притворяюсь, используя очень плохой хак. Я ищу лучший способ сделать это.

Файл а.h

#ifndef A_H
#define A_H
template
class Algo;
#include "b.h"
#endif

Файл b.h (этот файл автоматически сгенерирован из скрипта Python)

#define ENABLE_OPTIMIZATION 0
#include "c.h"
#undef
#define ENABLE_OPTIMIZATION 1
#include "c.h"
#undef

Файл c.h

template<>
class Algo{
  struct Foo{
    int a;
    #if ENABLE_OPTIMIZATION
    int b;
    #endif

    void bar(){
      #if ENABLE_OPTIMIZATION
      b = 0;
      #endif
    }
  };
};

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

РЕДАКТИРОВАТЬ :У меня есть несколько флагов оптимизации, и они взаимодействуют.

8
задан Mechanical snail 22 August 2012 в 20:43
поделиться