在C++中,是否可能使用宏条件与模板参数一起使用?

4

类似这样:

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

我需要这个来创建两个几乎相同类的变体,其中一个变体是轻量级的,出于性能原因。我不想使用一个将包装较轻的类的单独类。
如果是的话,是否可以使用任何类型(不仅仅是上面示例中的布尔值)?也许只适用于基本类型?枚举类型呢?
这段代码对我不起作用,但我希望我只是错过了一些小事情。

在这里给出好的答案之后,我要补充一点,你不能这样做的原因是预处理器会在编译器之前启动。 - Quentin
模板参数不是预处理器的事吗? - Reflection
1
@Reflection 不,预处理器在预编译时执行,模板参数在编译时执行。 - Jonathan H
2个回答

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;


如果我想将一段代码放在上面示例中的宏条件内运行怎么办?操作而不是声明。有没有比使用继承自包含特定操作函数的接口的类更好的方法? - Reflection
@Reflection 这实际上取决于你想做什么(听起来似乎你需要一个更具体的问题,并确切地列出你所需的特定事项)。如此所述,从中您可以继承额外成员和操作的父类是完全合理的。 - Mark B

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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接