簡體   English   中英

用戶定義的文字,僅在返回值上有所不同

[英]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

如果您需要將slopehumidity聚合起來,您可以定義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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM