是否可以在C ++中使用带有模板参数的宏条件?

时间:2015-01-21 22:19:41

标签: c++ templates

类似的东西:

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

我需要这个来创建几乎相同的类的两个变体,当出于性能原因,一个变体是较轻的变体。我不想使用一个单独的类来包装较轻的一个。

如果是,是否可以使用任何类型(不仅仅是上面示例代码中的bool)?也许只是原始类型?枚举怎么样?

这段代码对我不起作用,但我希望我错过了一些小事。

2 个答案:

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

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