我很好奇是否有一个简单的函数或结构之外的可能性。虽然我的代码稍微简化了一点,但如果不需要在显示和计算之间来回转换百分比,这将增加很多。
您不能凭空创建一个全新的后缀操作符。操作符的列表、语法和优先级设置为stone。
然而,语言中有一些东西可能足以满足您的需求:用户定义的文字
constexpr long double operator ""_pct(unsigned long long int v) {
return (long double)v / 100;
}
void foo() {
double x = 30_pct;
}
只能用于文字值,而不能用于任意表达式。但是,这是你能得到的最好的结果。
最好的方法是定义一个类型来处理百分比。
class Percentage {
public:
constexpr Percentage(int); // use explicit? This depends on requirements
constexpr Percentage(unsigned long long int);
constexpr Percentage(double);
constexpr operator int() const;
constexpr operator double() const;
constexpr Precentage fromRatio(double x) {
return {x * 100};
}
private:
.....
};
// custom literal is just sugar coating
Percentage operator ""_pct(unsigned long long int v) {
return Percentage(v);
}
除了前面讨论过的用户定义文字外,还可以使用百分比值类型。比如:
class Percent
{
public:
constexpr Percent(double v) : val(v) {}
constexpr double value() const { return val; }
constexpr double scale() const { return val / 100; }
/** brief Multiply a number by its scaled value
* Can also be done as a free function
*/
double operator *(double other) const
{
return other * scale();
}
// other operators
private:
double val;
};
std::ostream& operator <<(std::ostream& os, Percent p)
{
os << p.value() << '%';
return os;
}
正确使用constexpr
,您应该能够在没有任何运行时开销的情况下获得您想要的结果。