Могут ли пользовательские литералы иметь функции в качестве аргументов?

Можно ли использовать функции с пользовательскими литералами?

Если да, то что можно сделать? Это законно?

void operator "" _bar(int (*func)(int)) {
  func(1);
}

int foo(int x) {
  std::cout << x << std::endl;
}

int main() {
  foo(0);    // print 0
  foo_bar;   // print 1
}

4 ответа

Решение

Согласно проекту C++ от 11 февраля 2011 г. § 2.14.8, пользовательские литеральные типы - это целочисленные литералы, плавающие литералы, строковые литералы и символьные литералы. Нет способа сделать функционально-литеральный тип.

Пользовательский литерал обрабатывается как вызов литерального оператора или шаблона литерального оператора (13.5.8). Чтобы определить форму этого вызова для заданного пользователем литерала L с ud-суффиксом X, в контексте L ищется литеральный оператор-идентификатор с буквенным идентификатором суффикса X, используя правила для поиска без определения имени (3.4.1). Пусть S будет набором объявлений, найденных этим поиском. S не должно быть пустым.

Целые:

operator "" X (n ULL)
operator "" X ("n")
operator "" X <’c1’, ’c2’, ... ’ck’>()

Плавающий:

operator "" X (f L)
operator "" X ("f")
operator "" X <’c1’, ’c2’, ... ’ck’>()

Строка:

operator "" X (str, len)
operator "" X <’c1’, ’c2’, ... ’ck’>() //unoffcial, a rumored GCC extension

Символ:

operator "" X (ch)

Смотреть на foo_barЭто всего лишь один лексический маркер. Его интерпретируют как один идентификатор с именем foo_barне как foo с суффиксом _bar,

Я не знаю, добавляет ли это что-нибудь, но ничто не мешает вам определить

PythonScript operator"" _python(const char*, std::size_t len) {...}

R"Py(
  print "Hello, World"
)Py"_python;

Я на самом деле думаю, что пользовательские литералы могли бы стать хорошим способом для встраивания скриптов или SQL.

Нет.

C++ намеренно избегает таких махинаций, так как символ foo_bar будет очень трудно понять, если он не был определен непосредственно перед его использованием в вашем примере.

Вы можете добиться чего-то похожего с препроцессором.

#define bar (1)

int foo(int x) {
  std::cout << x << std::endl;
}

int main() {
  foo(0);    // print 0
  foo bar;   // print 1
}
Другие вопросы по тегам