У меня есть класс EDSobject:
class EDSobject
{
public:
...
int index;
int subindex;
std::string parameter;
std::string dataType;
int value;
};
В своем коде я записываю объекты этого класса в файл stringstream:
if (obj.dataType == "0x0002" || obj.dataType == "0x0003" || obj.dataType
== "0x0004") //signed data types
{
file << " 0x" << obj.subindex << " " <<
obj.parameter << " = " << dec << (int16_t)obj.value << endl;
}
else //unsigned data types
{
file << " 0x" << obj.subindex << " " <<
obj.parameter << " = " << dec << obj.value << endl;
}
Вы можете видеть, что если dataType равен "2", "3" или "4", я приведу значение к целому числу со знаком (значения внутри obj.value являются целым числом без знака). Это работает хорошо. Например, я получаю -1386 из 64150.
Проблема в том, что я пытался сделать это только с помощью литья, например:
void EDScastAllValues()
{
for (EDSobject obj : EDScontainer)
{
if (obj.dataType == "0x0002" || obj.dataType == "0x0003" ||
obj.dataType == "0x0004") //signed data types
{
int16_t newVal = static_cast<int16_t>(obj.value);
//or int16_t newVal = (int16_t)obj.value;
obj.value = newVal;
}
}
}
И затем писать все объекты одинаково, без оператора if.
file << " 0x" << obj.subindex << " " << obj.parameter << " = " << dec << obj.value << endl;
Здесь значение obj.value не меняется - 64150 по-прежнему равно 64150. Я не получаю отрицательных значений, как раньше.
Что я здесь не так делаю?
РЕДАКТИРОВАТЬ: забыл добавить определение EDSContainer.
set<EDSobject, cmp> EDScontainer;