Что я хотел бы сделать (в C ++), это создать тип данных «Параметр», который имеет значение, min и max.Затем я хотел бы создать контейнер для этих типов.
Например, у меня есть следующий код:
template <typename T>
class ParamT {
public:
ParamT() {
}
ParamT(T _value):value(_value) {
}
ParamT(T _value, T _vmin, T _vmax):value(_value), vmin(_vmin), vmax(_vmax) {
}
void setup(T vmin, T vmax) {
this->vmin = vmin;
this->vmax = vmax;
}
void setup(T value, T vmin, T vmax) {
setup(vmin, vmax);
setValue(value);
}
T operator=(const T & value) {
setValue(value);
}
void setValue(T v) {
value = v;
}
T getValue() {
return value;
}
operator T() {
return getValue();
}
protected:
T value;
T vmin;
T vmax;
};
typedef ParamT<int> Int;
typedef ParamT<float> Float;
typedef ParamT<bool> Bool;
В идеальном мире мой API будет выглядеть примерно так:
std::map<string, Param> params;
params["speed"] = PFloat(3.0f, 2.1f, 5.0f);
params["id"] = PInt(0, 1, 5);
или
params["speed"].setup(3.0f, 2.1f, 5.0f);
params["id"].setup(0, 1, 5);
и запись в них:
params["speed"] = 4.2f;
params["id"] = 1;
или
params["speed"].setValue(4.2f);
params["id].setValue(1);
и чтение:
float speed = params["speed"];
int id = params["id"];
или
float speed = params["speed"].getValue();
int id = params["id"].getValue();
Конечно, в приведенном выше коде у ParamT нет базового класса, поэтому я не могу создать карту.Но даже если я создам базовый класс для него, который расширяет ParamT, у меня, очевидно, не может быть разных getValues (), которые возвращают разные типы.Я думал о многих решениях, включая setValueI (int i), setValuef (float f), int getValueI (), float getValueF (), или карту для int, карту для float и т. Д. Но все кажется очень нечистым.Возможно ли в C ++ реализовать вышеуказанный API?
В настоящее время я занимаюсь только простыми типами, такими как int, float, bool и т. Д. Но я хотел бы распространить это на векторы (мои собственные) и потенциальноБольше.