0

単一の double 変数を中心に展開するこの小さなクラスがあります

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;

私は使用しており、構成(テキスト)ファイルから読み込まれた値「varName」を選択するために、変数を直接libconfig++渡すことができるようにしたいと考えています。stdlibconfig::lookupValue("varName" , std)

残念ながら、コンパイラは、.a を渡せないと言い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;

しかし、余分な入力やコード行などは避けたい.

それを行うために使用できる演算子オーバーロードのトリックはありますか?

ありがとうございました

4

1 に答える 1

1

あなたの問題はconst-nessに関するものです.constであり、const参照を返すものに依存しているstd間に非const参照に変換しようとしています。operator doublegetFactor

次のコードは意図したとおりに機能します。

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、非 const 参照として公開していることです。

于 2016-09-22T12:12:45.070 に答える