[英]User defined literals which only differ in the return values
這就是我想要實現的目標:我有兩個用戶定義的文字,一個采用長雙精度值並返回斜率,另一個也采用長雙精度值並返回濕度。 現在我想在一個 scope 中使用兩個 UDL。不幸的是,在這兩種情況下,單位都是“百分比”。
struct slope
{
long double val;
};
slope operator ""_perc(long double v)
{
slope s = {v};
return s;
}
struct humidity
{
long double val;
};
humidity operator ""_perc(long double v)
{
humidity h = {v};
return h;
}
void func(void)
{
slope s(0.0_perc);
humidity h(0.0_perc);
}
這是不可能的,因為兩個函數的簽名不能只在返回類型上不同。 我們可以使用命名空間:
namespace slp
{
slope operator ""_perc(long double v)
{
slope s = {v};
return s;
}
}
namespace hum
{
humidity operator ""_perc(long double v)
{
humidity h = {v};
return h;
}
}
但我敢說 state 用戶定義的文字只有在使用“不合格”時才有意義。 我們不想這樣使用它們:
void func(void)
{
slope s(slp::operator"" _perc(0.0));
humidity h(hum::operator"" _perc(0.0));
}
由於兩個 UDL 應在同一個 scope 中使用,我們不能使用“使用”,因為它會產生歧義:
using namespace slp;
using namespace hum;
要么
using slp::operator ""_perc;
using hum::operator ""_perc;
所以我被卡住了。 有什么——最好是優雅的——方法來實現我想要的嗎?
一個顯而易見的解決方案是提出不同的名稱。
如果您希望將“百分比”保留為一個數量,您可以使用百分比 class 並根據評論定義構造函數:
struct Percent {
long double value;
explicit constexpr Percent(long double v)
: value{v}
{
}
};
constexpr Percent operator""_perc(long double v) noexcept
{
return Percent(v);
}
struct slope {
long double val;
explicit slope(Percent pc)
: val{pc.value}
{
}
};
// humidity similar
如果您需要將slope
和humidity
聚合起來,您可以定義explicit
轉換運算符。
您可以通過創建額外的 scope 來作弊(因為 lambda 會立即執行):
void func(void)
{
auto s = [](){ using namespace slp; return 0.0_perc; }(); // slope
auto h = [](){ using namespace hum; return 0.0_perc; }(); // humidity
// ...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.