是否可以存储参数化类的所有有效实例?

时间:2012-11-05 14:12:34

标签: c++ templates

我有一个用数字参数化的类,但只有一些值实际上是有效参数。为了隐藏用户的实现并防止无效的实例化,我这样做了:

// foo.hpp
class IClass
{
  virtual void doStuff() = 0;
};

IClass& getHiddenClass(const bool& randomCondition);

// foo.cpp
template <unsigned x>
class HiddenClass : public IClass
{
public:
  void doStuff()
  {
    /* some code using x */
  }
};

IClass& getHiddenClass(const bool& randomCondition)
{
  static HiddenClass<42> ifRandomCondition;
  static HiddenClass<9000> ifNotRandomCondition;

  if (randomCondition)
    return ifRandomCondition;
  else
    return ifNotRandomCondition;
}

是否有更好的解决方法?这个例子是简化和抽象的,但我也不需要存储大量有效的实例。

2 个答案:

答案 0 :(得分:2)

使用static_assert来防止无效的实例化,可在C ++ 11中使用。

我不明白你的“隐藏课”的目的。接口就是这样做的 - 从用户隐藏实现,只让他们拥有一组可以使用的预定义操作。在单独的头文件中声明您的接口并与用户共享。从接口(在另一个非共享头文件中)继承您的具体类,并在cpp文件中实现它(再次,非共享)。

答案 1 :(得分:1)

这是合法的。您也可以尝试通过枚举来参数化类,然后您将在类中进行操作。这可能比您发布的内容更具有可读性,具体取决于您的具体情况。