c++ 在 libconfig++ :: lookupValue() 中将 class 实例作为浮点变量传递
c++ passing class instance as float variable in libconfig++ :: lookupValue()
我有一个小的class,它围绕着一个双精度变量
class SensorTrainData
{
public:
SensorTrainData() : trainingRangeFactor(2.0f) {}
SensorTrainData( const double & _factor ) { setFactor(_factor); }
SensorTrainData & operator=(const double& other)
{
setFactor(other);
return *this;
}
operator double() const
{
return getFactor();
}
private:
void setFactor( const double & factor );
const double & getFactor() const { return trainingRangeFactor; }
double trainingRangeFactor;
};
这些用户函数double()
和运算符“=”重载允许我分别做
SensorTrainData std(3.0f);
double d = std;
double k = 4.0f;
std = k;
我正在使用 libconfig++
,我希望能够直接在 libconfig::lookupValue("varName" , std)
中传递变量 std
,以便选择已读取的值 "varName"来自配置(文本)文件。
不幸的是,编译器说我不能传递 SensorTrainData &
。
src/sensor.cpp:1048:45: error: no matching function for call to ‘libconfig::Setting::lookupValue(const char [12], enalu::SensorTrainData&) const’
src/sensor.cpp:1048:45: note: candidates are:
...
....
/usr/include/libconfig.h++:255:8: note: bool libconfig::Setting::lookupValue(const char*, double&) const
/usr/include/libconfig.h++:255:8: note: no known conversion for argument 2 from ‘enalu::SensorTrainData’ to ‘double&’
当然可以
double foo = 0.0f;
libconfig::lookupValue("varName" , foo); //load varName from file into foo
std = foo;
但我想避免额外的打字和代码行等。
有没有运算符重载技巧我可以用来做到这一点?
谢谢
你的问题是关于 const-ness:你试图将 std
转换为非常量引用,而你的 operator double
是 const 并且依赖于 getFactor
returns 常量引用。
以下代码按预期工作:
class SensorTrainData
{
public:
SensorTrainData() : trainingRangeFactor(2.0f) {}
SensorTrainData( const double & _factor ) { setFactor(_factor); }
SensorTrainData & operator=(const double& other)
{
setFactor(other);
return *this;
}
operator double&()
{
return getFactor();
}
private:
void setFactor( const double & factor ) { trainingRangeFactor = factor; }
double & getFactor() { return trainingRangeFactor; }
double trainingRangeFactor;
};
明显的缺点是您现在将 trainingRangeFactor
作为非常量引用公开。
我有一个小的class,它围绕着一个双精度变量
class SensorTrainData
{
public:
SensorTrainData() : trainingRangeFactor(2.0f) {}
SensorTrainData( const double & _factor ) { setFactor(_factor); }
SensorTrainData & operator=(const double& other)
{
setFactor(other);
return *this;
}
operator double() const
{
return getFactor();
}
private:
void setFactor( const double & factor );
const double & getFactor() const { return trainingRangeFactor; }
double trainingRangeFactor;
};
这些用户函数double()
和运算符“=”重载允许我分别做
SensorTrainData std(3.0f);
double d = std;
double k = 4.0f;
std = k;
我正在使用 libconfig++
,我希望能够直接在 libconfig::lookupValue("varName" , std)
中传递变量 std
,以便选择已读取的值 "varName"来自配置(文本)文件。
不幸的是,编译器说我不能传递 SensorTrainData &
。
src/sensor.cpp:1048:45: error: no matching function for call to ‘libconfig::Setting::lookupValue(const char [12], enalu::SensorTrainData&) const’
src/sensor.cpp:1048:45: note: candidates are:
...
....
/usr/include/libconfig.h++:255:8: note: bool libconfig::Setting::lookupValue(const char*, double&) const
/usr/include/libconfig.h++:255:8: note: no known conversion for argument 2 from ‘enalu::SensorTrainData’ to ‘double&’
当然可以
double foo = 0.0f;
libconfig::lookupValue("varName" , foo); //load varName from file into foo
std = foo;
但我想避免额外的打字和代码行等。
有没有运算符重载技巧我可以用来做到这一点?
谢谢
你的问题是关于 const-ness:你试图将 std
转换为非常量引用,而你的 operator double
是 const 并且依赖于 getFactor
returns 常量引用。
以下代码按预期工作:
class SensorTrainData
{
public:
SensorTrainData() : trainingRangeFactor(2.0f) {}
SensorTrainData( const double & _factor ) { setFactor(_factor); }
SensorTrainData & operator=(const double& other)
{
setFactor(other);
return *this;
}
operator double&()
{
return getFactor();
}
private:
void setFactor( const double & factor ) { trainingRangeFactor = factor; }
double & getFactor() { return trainingRangeFactor; }
double trainingRangeFactor;
};
明显的缺点是您现在将 trainingRangeFactor
作为非常量引用公开。