gpt4 book ai didi

c++11 用户定义的物理属性单位文字

转载 作者:太空狗 更新时间:2023-10-29 23:43:43 25 4
gpt4 key购买 nike

我正在尝试学习如何将 C++11 用户定义的文字用于物理属性的单位。问题是,如何避免混合使用这些单位。所以 (8.0_kg + 8.0_km)--> 给出错误。有什么想法吗?我是 C++ 的新手,请客气。

class Mass{
public:
//Mass(){
// cout << "only Mass units allowed in here" << endl;
//}
//~Mass();
long double getWeight(long double a);
double car, house, cat;

private:
long double a;


};


long double Mass::getWeight(long double w) {

cout << "returning argument: " << w << '\n'<< endl;
return 0;
}


long double operator"" _km(long double d) { return d * 1000.0; }
long double operator"" _m (long double d) {return d;}
long double operator"" _cm(long double d) { return d / 100.0; }

long double operator"" _tonne(long double m) { return m * 1000.0 ; }
long double operator"" _kg(long double m) { return m ; }
long double operator"" _lb(long double m) { return m * 0.453592; }

long double getDistance(long double d){
long double starting_d = 61.0_kg;
long double total_d = d + starting_d;
cout << "the distance I have run is: " << total_d << endl;
return 0;
}

int main() {


cout << 6.0_km << endl;
cout << 6.0_km + 3.0_m << endl;
cout << 6.0_km + 3.0_m + 15.0_cm << '\n' << endl;

cout << 8.0_tonne << endl;
cout << 8.0_km + 4.0_kg << endl;
cout << 8.0_km + 4.0_kg + 21.0_lb << '\n' << endl;


long double distance = 5.45_km;
getDistance(distance);

Mass obj1;
obj1.getWeight(13.96_lb);

cout << "This is clearly wrong: "<< 8.0_km + 4.0_kg << endl;

obj1.getWeight(10.96_km); // so is this


}

最佳答案

您需要定义自己的类型,因为您不能限制原始类型表示的内容。

您可以使用“标记模板”1 来避免重复运算符等并确保其类型安全。
这可以扩展,例如,编译器检查 distance * distance = areaspeed * time = distance

这是一个简短的例子:

template<typename Kind>
struct Value
{
long double value;
Value& operator+= (Value v) { value += v.value; return *this; }
};

template <typename Kind>
Value<Kind> operator+ (Value<Kind> lhs, Value<Kind> rhs) { return lhs += rhs; }

// These types don't need definitions; we only need some unique type names.
struct M;
struct D;

using Mass = Value<M>;
using Distance = Value<D>;

Mass operator"" _kg(long double d) { return { d };}
Mass operator"" _lb(long double d) { return { d * 0.453592 };}

Distance operator"" _km(long double d) { return { d * 1000 };}
Distance operator"" _mile(long double d) { return { d * 1609 };}

int main()
{
// OK
Distance d = 1.2_km + 0.2_mile;
// OK
Mass m = 2.3_kg + 1.4_lb;
// invalid operands to binary expression ('Distance' (aka 'Value<D>')
// and 'Mass' (aka 'Value<M>'))
Distance d2 = 2.4_km + 1.2_kg; // Nope
}

1) 我不认为 C++ 中有一个既定的术语,但它与 Haskell 所称的 phantom types 非常相似。 .

关于c++11 用户定义的物理属性单位文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42625962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com