1

ideoneコードは次のとおりです:http://ideone.com/Qp8Eqg

私の質問は、左辺値のみに基づいて変換を強制することは可能ですか?例えば、

[Seconds] s = 2_h + 60_s;
cout <<s.getSeconds()<<endl;

明らかに、2_h.toSeconds()のようなものを作成する必要がありますが、それは冗長すぎて、アイデアを実現できません。

4

2 に答える 2

3

これを許可するには(これはあなたが書いたものよりもあなたの質問である可能性が高いです、私が間違っている場合は私を訂正してください):

Seconds s = 2_h;

operator Seconds() const以下は機能します:クラスに追加Hours

class Hours {
    unsigned long long _hours;
public:
    Hours(unsigned long long hours) : _hours(hours) { }

    operator Seconds() const;

    unsigned long long getHours() const {
        return this->_hours;
    }
};

そしてクラスの後にそれを定義しますSeconds

Hours::operator Seconds() const { return this->_hours * 3600; }
于 2013-03-25T19:37:11.857 に答える
1

与えられた答えですでに述べたように、からへのoperator Seconds ()自動変換を可能にするために実装する必要があります。この演算子を使用すると、を簡略化することもできます。また、実行時間を改善するために、コンパイル時に値を評価するためにいくつかを投入することもできます。HoursSecondsoperator+constexpr

#include <iostream>

class Seconds {
    public:
        constexpr Seconds(const Seconds& other) : seconds_(other.seconds_) {}
        constexpr Seconds(unsigned long long seconds) : seconds_(seconds) {}

        Seconds& operator=(const Seconds& other) {
            seconds_  = other.seconds_;
            return *this;
        }

        constexpr unsigned long long value() const {
            return this->seconds_;
        }

    private:
        unsigned long long seconds_;
};


class Hours {
    public:
        constexpr Hours(const Hours& other) : hours_(other.hours_) {}
        constexpr Hours(unsigned long long hours) : hours_(hours) {}

        Hours& operator=(const Hours& other) {
            hours_ = other.hours_;
            return *this;
        }

        unsigned long long value() const {
            return this->hours_;
        }

        operator Seconds () const { return Seconds(hours_*60*60); }
    private:
        unsigned long long hours_;
};


constexpr Seconds operator+(const Seconds& lhs, const Seconds& rhs) 
{
    return Seconds(lhs.value()+rhs.value());
}

constexpr Hours operator "" _h(unsigned long long hours) {
    return Hours(hours);
}

constexpr Seconds operator "" _s(unsigned long long seconds) {
    return Seconds(seconds);
}


int main() {
    using namespace std;

    Seconds s = 1_h + 10_s;
    cout <<s.value()<<endl;
    s = 2_h + 60_s;
    cout <<s.value()<<endl;
    return 0;
}
于 2013-03-25T19:53:24.420 に答える