LINUX.ORG.RU

c++: что за синтаксис используется в шаблоне класса function<Res(ArgTypes...)>?

 


0

1

Что за синтаксис используется в описании шаблоного класса function<Res(ArgTypes...)>? Про вариативные шаблоны знаю, интересует что за синтаксис со скобками, где про это описано?

============================================

По результатм обсуждения понял, что как пример, такой синтаксис применим для предварительного объявления функций:

using func = void(int, float);
// объявляем две функции `void myFunc1(int, float)` и `void myFunc2(int, float)`
func myFunc1, myFunc2;



Последнее исправление: cetjs2 (всего исправлений: 2)

Это частичная специализация на тип функции в качестве шаблонного параметра. Как T* для указателей, но для функций.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Ну а где можно увидеть описание к этому синтаксису? Если знаешь как называется, то найти не сложно, а по фразе «частичная специализация на тип функции» нашлось много чего но все не то.

victor79
() автор топика
Ответ на: комментарий от victor79

Здесь нет ничего особенного. Это обычная специализация и обычный синтаксис объявления функции (если имя выбросить), а точнее её сигнатура. Про частичную специализацию можно здесь глянуть, например. Про функции там тоже что-то есть, но не уверен, что сильно полезно.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

синтаксис объявления функции (если имя выбросить), а точнее её сигнатура

https://timsong-cpp.github.io/cppwp/n4659/defns.signature

signature ⟨function⟩ name, parameter-type-list, and enclosing namespace

Если выбросить имя, это уже не сигнатура. И сигнатура включает в себя только тип параметров, но не возвращаемый тип.

anonymous
()

интересует что за синтаксис со скобками

Никогда (тип) функций не видел?

anonymous
()
Ответ на: комментарий от anonymous

Ну, мы не в контексте стандарта говорим. Слово «сигнатура» вроде используется как синоним типа функции.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Слово «сигнатура» вроде используется как синоним типа функции

Не помню, чтобы встречал такое. Помню что встречал как синоним набора типов аргументов. (И скорее всего (лень проверять), это совпадает с определением в стандарте C. В стандарте C++ к сигнатуре добавляется имя функции и неймспейса).

anonymous
()
Ответ на: комментарий от xaizek

Ну если выбросить имя, то получится Res(*)(Args...). Если убрать * как признак указателя, то Res()(Args...), хотя где такое можно применять не понятно. И дальше, где прописано, что Res()(Args...) эквивалентно Res(Args...)?

victor79
() автор топика
Ответ на: комментарий от victor79

Есть типы указателей на функции, типы ссылок на функции и типы функций (первые два это составные типы с участием последних):

using fptr = void(*)(int, float);
using fref = void(&)(int, float);
using func = void(int, float);
using fptr2 = func*; // == fptr
using fref2 = func&; // == fref

// объявляем две функции `void myFunc1(int, float)` и `void myFunc2(int, float)`
func myFunc1, myFunc2;

Сами типы функций обычно только в шаблонных параметрах и появляются, хотя их можно использовать и менее очевидными способами.

И дальше, где прописано, что Res()(Args…) эквивалентно Res(Args…)?

Как типы они разные: указатель на функцию != функции. Просто функции автоматически разлагаются до типа указателя на них.

xaizek ★★★★★
()
Ответ на: комментарий от anonymous

В стандарте C++ к сигнатуре добавляется имя функции и неймспейса

Ещё должны быть const-, volatile- и ref-qualifiers. По ним ведь тоже перегрузка происходит.

В стандарте C слова «signature» не нахожу. Ну, может это только я его так использую.

xaizek ★★★★★
()
Последнее исправление: xaizek (всего исправлений: 1)
Ответ на: комментарий от xaizek
using func = void(int, float);

// объявляем две функции `void myFunc1(int, float)` и `void myFunc2(int, float)`
func myFunc1, myFunc2;

Все, понял, всем спасибо.

victor79
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.