Строковый литерал с зависимым типом - невозможно?
Можно ли определить пользовательский оператор преобразования строкового литерала, чтобы тип его результата зависел от значения его ввода строки?
Это легко с пользовательскими целыми числами и литералами с плавающей запятой, поскольку они допускают литеральные шаблоны операторов, а фактические символы литерала передаются ему как аргументы шаблона. Пример:
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-вручную и не будет (напрямую) включать в себя определяемый пользователем литерала синтаксис. У него много проблем.