我想創建一個列表(std ::容器或甚至列表*將是好的)數字(int和double),可以對它們施加限制。C++:限制數字的異構模板
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;
我已經嘗試了這兩種不同的方式,但我不滿意他們中的任何一個。無法從公共基礎派生,因爲基礎類型不知道「值」,因爲它不知道類型或必須提前定義類型。試用了宏模板,但低調感覺很sl。。有沒有辦法做到這一點,而不訴諸所有類型的聯合與類型標識符來選擇正確的成員?
的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
我不知道這是否已經在圖書館解決。使用名稱 - 值對的API非常常見,數值屬性的最小和最大有效值也是如此。 – paperjam 2011-04-25 21:34:41
要清楚,你想要產生一個原始的或有界的類型之一的價值嗎?此外,它可以是任何原始或只是整數和雙打? – 2011-04-26 00:52:40
「值」應該只需要是一個基本類型,但我可以看到需要int64_t。 – lister 2011-04-26 14:38:51