我需要代表Volts,Ampers和Watts及它們之間的關係(例如W = V * I)。C++:是否有一種較爲冗長的方式來表示自定義數字類型?
這就是我隨之而來的,但它看起來非常冗長。有關如何使它更簡潔的想法?
#include <stdio.h>
#include <iostream>
template<class T>
class double_val {
public:
explicit double_val(double val):_val(val) { };
double_val(const T& other) {
_val = other._val;
}
T& operator=(const T &other) {
_val = other._val;
return *this;
}
T operator+ (const T& other) const {
return T(this->_val + other._val);
}
T operator+ (double val) const {
return T(this->_val + val);
}
T operator- (const T& other) const {
return T(this->_val - other._val);
}
T operator- (double val) const {
return T(this->_val - val);
}
T operator* (const T& other) const {
return T(this->_val * other._val);
}
T operator* (double val) const {
return T(this->_val * val);
}
T operator/ (const T& other) const {
return T(this->_val/other._val);
}
T operator/ (double val) const {
return T(this->_val/val);
}
bool operator== (const T& other) const{
return this->_val == other._val;
}
bool operator!= (const T& other) const{
return this->_val != other._val;
}
bool operator > (const T& other) const{
return this->_val > other._val;
}
bool operator >= (const T& other) const{
return this->_val >= other._val;
}
bool operator < (const T& other) const{
return this->_val < other._val;
}
bool operator <= (const T& other) const{
return this->_val <= other._val;
}
void val(double val){
_val = val;
}
double val() const {
return _val ;
}
virtual const char* name() const = 0;
private:
double _val;
};
template<class T>
std::ostream& operator<<(std::ostream &os, const double_val<T> &t) {
return os << t.val() << " " << t.name();
}
class Amper:public double_val<Amper> {
public:
Amper(double val):double_val<Amper>(val) {}
const char* name() const {
return "Amper";
}
};
class Volt:public double_val<Volt> {
public:
Volt(double val):double_val<Volt>(val) {}
const char* name() const {
return "Volt";
}
};
class Watt:public double_val<Watt> {
public:
Watt(double val):double_val<Watt>(val) {}
const char* name() const {
return "Watt";
}
};
// Watt = I * V
Watt operator* (const Volt &v, const Amper& a) {
return Watt(a.val() * v.val());
}
Watt operator* (const Amper &a, const Volt& v) {
return Watt(a.val() * v.val());
}
// Volts = Watts/Ampers
Volt operator/(const Watt &w, const Amper& a) {
return Volt(w.val()/a.val());
}
// Ampers = Watts/Volts
Amper operator/(const Watt &w, const Volt& v) {
return Amper(w.val()/v.val());
}
int main(int argc, char **argv) {
using namespace std;
Watt w = Volt(66) * Amper(7);
Amper a = w/(Volt(646) * Volt(444));
cout << a << endl;
return 0;
}
(注:我intentionaly省略運營商雙(),因爲我想避免像伏禁止的OPS(4)+瓦特(6))
查看此Boost庫:http://www.boost.org/doc/libs/1_47_0/doc/html/boost_units.html - 它可以滿足您的需求:單位轉換,維數分析等。 – Archie
有你看了Boost.Units?看起來非常適合你的任務。 – pmr