Могут ли пользовательские литералы иметь функции в качестве аргументов?
Можно ли использовать функции с пользовательскими литералами?
Если да, то что можно сделать? Это законно?
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
}