제한을 가할 수있는 숫자 (int 및 double) 목록 (std :: container 또는 list * 괜찮습니다)을 만들고 싶습니다.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;
저는 여러 가지 방법을 시도했지만 그 중 하나에 만족하지 않습니다. 기본 유형은 유형을 알지 못하거나 사전 정의 된 유형을 가져야하기 때문에 기본 유형이`value '에 대해 알지 못하기 때문에 공통 기본에서 파생 될 수 없습니다. 매크로 템플릿으로 시도했지만 다운 캐스트는 엉성함을 느낍니다. 형식 식별자가있는 모든 유형의 조합을 사용하지 않고 올바른 구성원을 선택하는 대신이 작업을 수행 할 수있는 방법이 있습니까?
부스트 :: 오버로드 된 생성자와 변형 내가 컴파일 타임에 모든 유형을 열거하는 것을 제외하고, 지금까지 원하는 것을 할 것 같다 :
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
명확하게 말하자면, 값이 기본형 또는 제한된 유형 중 하나를 얻을 수 있도록 하시겠습니까? 또한, 어떤 원시 또는 int 및 double 수 있습니까? –
"value"는 int64_t가 필요함을 알 수 있지만 근본적인 형식 일 필요가 있습니다. – lister