Я хочу создать список (std :: container или даже list * будет в порядке) чисел (int и double), для которых могут быть наложены ограничения.
template<typename T>
class setting {
public:
std::string name, units;
T value, min, max, step;
setting(std::string n, T val) : name(n), value(val) { }
setting operator++(int) {
setting tmp = *this;
value += step; if(value > max) value = max;
return tmp;
}
};
...
list.add(new setting<int>("channel", 4));
list.add(new setting<double>("amplitude", 5.6));
...
for(int i = 0; i < list.size(); i++)
std::cout << list[i].name << ": " << list[i].value << std::endl;
Я пробовал это несколькими способами, но я не доволен ни одним из них.Не может быть получено из общей базы, потому что базовый тип не знает о `значении ', потому что он не знает тип или должен иметь тип, определенный заранее.Попробовал это с шаблонами макросов, но унылый чувствует себя неряшливо.Есть ли способ сделать это, не прибегая к объединению всех типов с идентификатором типа, чтобы выбрать правильный член?
boost :: многоадресный вариант с перегруженными конструкторами, кажется, делает то, что я пока хочу, за исключением того, чтоперечислить все типы во время компиляции:
class setting {
public:
boost::variant<
bool,
int8_t,
uint8_t,
int16_t,
uint16_t,
int32_t,
uint32_t,
int64_t,
uint64_t,
float,
double,
std::string
> value;
std::string name;
setting(std::string n, int v) : name(n), value(v) { }
setting(std::string n, double v) : name(n), value(v) { }
setting(std::string n, std::string v) : name(n), value(v) { }
};
typedef std::map<std::string, setting*> MapType;
typedef MapType::const_iterator MapItr;
int main() {
MapType settinglist;
settinglist["height"] = new setting("height", 1.3);
settinglist["width"] = new setting("width", 5);
settinglist["name"] = new setting("name", "the name");
for(MapItr i = settinglist.begin(); i != settinglist.end(); ++i) {
std::cout << i->second->name
<< " : " << i->second->value
<< std::endl;
}
return 0;
};
дает:
height : 1.3
name : the name
width : 5