我有一个用数字参数化的类,但只有一些值实际上是有效参数。为了隐藏用户的实现并防止无效的实例化,我这样做了:
// 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;
}
是否有更好的解决方法?这个例子是简化和抽象的,但我也不需要存储大量有效的实例。
答案 0 :(得分:2)
使用static_assert
来防止无效的实例化,可在C ++ 11中使用。
我不明白你的“隐藏课”的目的。接口就是这样做的 - 从用户隐藏实现,只让他们拥有一组可以使用的预定义操作。在单独的头文件中声明您的接口并与用户共享。从接口(在另一个非共享头文件中)继承您的具体类,并在cpp文件中实现它(再次,非共享)。
答案 1 :(得分:1)
这是合法的。您也可以尝试通过枚举来参数化类,然后您将在类中进行操作。这可能比您发布的内容更具有可读性,具体取决于您的具体情况。