用户定义的文字,仅返回值不同

这就是我要实现的目标:我有两个用户定义的文字,其中一个取长双精度值并返回斜率,另一个则取长双精度值并返回湿度。现在,我想在一个范围内使用两个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;
    }
}

但我敢说用户定义的文字仅在使用“不限定”时才有意义。我们不想以这种方式使用它们:

void func(void)
{
    slope s(slp::operator"" _perc(0.0));
    humidity h(hum::operator"" _perc(0.0));
}

由于两个UDL都应在同一范围内使用,因此我们不能使用“ using”,因为它会产生歧义:

using namespace slp;
using namespace hum;

要么

using slp::operator ""_perc;
using hum::operator ""_perc;

所以我被困住了。 有什么(最好是优雅的)方式来实现我想要的吗?

评论