让我们假设我有一个接口类(假设示例,而不是真正的代码),如
template <int year>
class Car {
public:
virtual void move(double x, double y) = 0;
// etc etc
};
和许多派生类如
template <int year>
class Model8556 : virtual public Car<year> {
private:
void move(double x, double y) {
// ...
}
int yearMax = 2000; // different for every model
int yearMin = 1990;
// etc etc
};
我通过
选择某个模型Car<foo>* myCar;
switch (bar) {
case 1: myCar = new model3434<foo>(); break;
case 2: myCar = new model8295<foo>(); break;
// etc
}
我确实想在编译时检查Car的模板参数(或者更好:派生类的模板参数)。我希望模板参数年保持在一定范围内(即在yearMin和yearMax之间)。但是:这个特定范围在派生类之间有所不同。 (编辑:) 由于有很多派生类,我更喜欢Car内的解决方案。
我怎么能实现这种行为?或者这是一个糟糕的设计?
感谢任何帮助。
答案 0 :(得分:6)
你是说这个吗?
template <int year>
class Model8556 : virtual public Car<year> {
private:
static const int yearMax = 2000; // I assume you meant a static constant
static const int yearMin = 1990;
static_assert( yearMin <= year && year <= yearMax, // Condition
"Invalid template argument specified!" ); // Error message
};
Demo.
使用当前方法不可能将其放入基类中; CRTP不起作用,因为派生类在Car
内被认为是不完整的。但是,结构的改变可能有所帮助。
template <int year>
class Car
{
// Your implementation, as above
};
template <int year,
int YearMin,
int YearMax>
class CarChecker : Car<year>
{
// Optionally declare constants here
static_assert( YearMin <= year && year <= YearMax,
"Invalid template argument specified!" );
};
template <int year>
class Model8556 :
public CarChecker<year, 1990, 2000> // Specify the minimum and maximum here
{};