Это то, чего я хочу добиться: у меня есть два пользовательских литерала, один из которых принимает длинное двойное значение и возвращает наклон, а другой также принимает длинное двойное значение и возвращает влажность. Теперь я хочу использовать оба 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;
Так что я застрял. Есть ли какой-нибудь - желательно элегантный - способ добиться того, чего я хочу?