Насколько я понимаю писать так нельзя:
auto operator "" _id(auto x) { return x; }
Кто знает с чем связано и есть ли надежда ?
Здравствуйте, _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
Но, кажется, пользовательские литералы предполагают какой-то один тип. Например, число. Или, например, строку.
Здравствуйте, Кодт, Вы писали:
В 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; }