Type(Types...)
- это , а не «специальный синтаксис».Причина, по которой std::function
принимает R(Args...)
, заключается в том, что он специализируется на типе функции R(Args...)
.Вот его декларация из стандарта:
template<class> class function; // undefined
template<class R, class... ArgTypes> class function<R(ArgTypes...)>;
Важно понимать, что синтаксис R(ArgTypes...)
определяет тип функции.Если вы объявите функцию, такую как int foo(int arg)
, тип foo
будет int(int)
.
Вы можете создать свои собственные структуры, которые принимают аргументы таким образом:
template <class>
struct X;
template <class R, class ...Args>
struct X<R(Args...)> {
typedef R result_type;
// ... whatever
};
Причина, по которой вы не можете использовать int(int)
с std::vector
или std::tuple
, заключается в их объявлениях:
template<class T, class Allocator = allocator<T>> class vector;
template<class... Types> class tuple;
Когда вы делаете std::vector<int(int)>
, вы заменяете T
на int(int)
, который не будет работать, потому что построение std::allocator<int(int)>
не удастся (вы не можете выделить типы функций).
Когда вы делаете std::tuple<int(int)>
, вы передаете int(int)
в качестве первого типа в пакете параметров Types
, который также не будет работать, потому что вы не можете иметь типы функций в качестве члена данных.