0

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

// 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;
}

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

4

2 回答 2

2

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

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

于 2012-11-05T14:15:08.450 回答
1

就其而言,这是合法的。您也可以尝试通过枚举来参数化类,然后在类中使用它。这可能比您发布的内容更具可读性,具体取决于您的具体情况。

于 2012-11-05T14:18:33.667 回答