gpt4 book ai didi

c++ - 根据 Derived 中的值检查 Base 类的模板参数

转载 作者:行者123 更新时间:2023-11-30 00:49:51 26 4
gpt4 key购买 nike

假设我有一个像

这样的接口(interface)类(虚构的示例,不是真实的代码)
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 中的解决方案。

我怎样才能实现这种行为?或者这是糟糕的设计?

感谢任何帮助。

最佳答案

你是这个意思吗?

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

关于c++ - 根据 Derived 中的值检查 Base 类的模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26917575/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com