Строковый литерал с зависимым типом - невозможно?

Можно ли определить пользовательский оператор преобразования строкового литерала, чтобы тип его результата зависел от значения его ввода строки?

Это легко с пользовательскими целыми числами и литералами с плавающей запятой, поскольку они допускают литеральные шаблоны операторов, а фактические символы литерала передаются ему как аргументы шаблона. Пример:

template <char... s> struct silly { using type = int; };
template <char... s> struct silly<'1', s...> { using type = double; };

template <char... s>
typename silly<s...>::type operator"" _silly() { return 0; }

static_assert(std::is_same<int, decltype(4321_silly)>::value, "no luck");
static_assert(std::is_same<double, decltype(1234_silly)>::value, "no luck");

Нет такой вещи, которая существует для пользовательских строковых литералов.

Есть ли другой способ сделать это, либо в текущем стандарте, либо запланирован/обсужден для какой-либо будущей редакции?

Ответы

Ответ 1

Нет, не возможно, за пределами серьезного хакерства. Доступ к строковым литералам осуществляется через constexpr, а тип возврата constexpr не может зависеть от значений аргументов.

Предлагаемый <char...> operator"" для строковых литералов столкнулся с проблемами с "сырыми или обработанными" проблемами и как их определить, а где они были сброшены, поскольку хеширование этих проблем вовремя для следующего стандарта было бы трудным и/или ROI будет низким. (по крайней мере, из моего случайного чтения того, что произошло).

Я не знаю, умерла ли она на лозе или все еще работает.

Хакер будет передавать <arr[0], arr[1], arr[2]> в template pseduo-вручную и не будет (напрямую) включать в себя определяемый пользователем литерала синтаксис. У него много проблем.