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 作为非常量引用公开。