Шаблонные пользовательские операции преобразования
От: _NN_ www.nemerleweb.com
Дата: 27.06.17 18:22
Оценка:
Насколько я понимаю писать так нельзя:
auto operator "" _id(auto x) { return x; }


Кто знает с чем связано и есть ли надежда ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Шаблонные пользовательские операции преобразования
От: Кодт Россия  
Дата: 28.06.17 07:58
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Кто знает с чем связано и есть ли надежда ?


Связано, видимо, с тем, что аргумент пользовательского литерала — это литерал же из набора (целое число, вещественное число, символ, строка) — то, что является литералом для парсера.
Какой смысл и какой способ шаблонизировать операции над ними?

Если очень хочется, то достаточно написать перегрузки, которые покроют все эти случаи. (Причём, для строк там другая арность, — возможно, что именно это технически подламывает шаблонизацию)
Если этого хочется много раз, то можно написать макрос
#define VERSATILE_LITERAL(suffix, implementation) \
  auto operator "" suffix(unsigned long long x            ) { return implementation(x); } \
  auto operator "" suffix(long double        x            ) { return implementation(x); } \
  auto operator "" suffix(char               x            ) { return implementation(x); } \
  auto operator "" suffix(wchar_t            x            ) { return implementation(x); } \
  auto operator "" suffix(const char*        x, size_t len) { return implementation(x); } \
  auto operator "" suffix(const wchar_t*     x, size_t len) { return implementation(x); } \
//endmacro

http://ideone.com/CGSVW5

Но, кажется, пользовательские литералы предполагают какой-то один тип. Например, число. Или, например, строку.
Перекуём баги на фичи!
Re[2]: Шаблонные пользовательские операции преобразования
От: _NN_ www.nemerleweb.com
Дата: 29.06.17 07:46
Оценка:
Здравствуйте, Кодт, Вы писали:

В GCC 7.1 пример выше компилируется.

Покрыть все случае похоже можно так:
template<typename T, T...> auto operator "" _xx() { return 0;}
template<char...> auto operator "" _xx() { return 0;}

// Почему-то '1'_xx и L'1'_xx не попадают в случаи выше.
auto operator "" _xx(char) { return 0;}
auto operator "" _xx(wchar_t) { return 0;}


И добавить перегрузки как указано выше:
auto operator "" _xx(unsigned long long x) { return 0; }
auto operator "" _xx(long double x) { return 0; }
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.