2015-01-21 4 views
4

Что-то вроде:Можно ли использовать условия макроса с аргументами шаблона в C++?

template<bool HOLD_MANUFACTURER> 
class Computer { 
    int memory; 
    int storage; 
#if HOLD_MANUFACTURER 
    char *manufacturer; 
#endif 
}; 

мне это нужно, чтобы создать две вариации почти того же класса, когда одна вариация зажигалку один из соображений производительности. Я не хочу использовать отдельный класс, который обернет более легкий.

Если да, возможно ли это для любого типа (не только bool из примера кода выше)? Может быть, только примитивные типы? Как насчет перечислений?

Этот код не работает для меня, но я надеюсь, что я только что пропустил какую-то мелочь.

+0

К хорошим ответам здесь я добавлю, что причина, по которой вы не можете этого сделать, состоит в том, что препроцессор запускается перед компилятором , – Quentin

+0

не являются аргументами шаблона препроцессором? – Reflection

+1

@Reflection Нет, препроцессор находится в предварительной компиляции, аргументы шаблона находятся во время компиляции. – Sheljohn

ответ

3

Не возможно, но вы можете использовать шаблон специализацию и наследование:

template <bool HoldManufacturer> 
class ComputerAdditions 
{}; 

template <> 
class ComputerAdditions<true> 
{ 
protected: 
    char *manufacturer; 

public: 
    // Methods using this additional member 
}; 

template <bool HoldManufacturer = false> 
class Computer 
    : public ComputerAdditions<HoldManufacturer> 
{ 
    int memory; 
    int storage; 

public: 
    // Methods of Computer 
} 
6

Вы можете творчески использовать пустую оптимизацию базы в подходе политики для достижения почти то, что вы хотите:

struct NO_MANUFACTURER {}; 
struct HOLD_MANUFACTURER { char *manufacturer; }; 

template <typename ManufacturerPolicy> 
class Computer : public ManufacturerPolicy 
{ 
    int memory; 
    int storage; 
} 

Затем экземпляр в качестве Computer<HOLD_MANUFACTURER> computer_with_manufacturer;

+0

Что делать, если я хочу поместить часть кода в состояние макроса из приведенного выше примера? Операции вместо объявления. Есть ли лучший способ, чем использовать класс, который будет наследовать от интерфейса, который будет включать функцию для этих конкретных операций? – Reflection

+0

@Reflection Это действительно зависит от того, что именно вы хотите сделать (это звучит почти так, как будто вам нужен новый, более конкретный вопрос, с точными подробностями, которые вам нужны). Как указано здесь, родительский класс, из которого вы можете наследовать дополнительные члены и операции, вполне разумен. –