#c #bind #msdn #unspecified
#c #привязка #msdn #неуказанный
Вопрос:
Я исследовал, что std::bind
такое и для чего это нужно (это может в конечном итоге быть другим вопросом) в MSDN: http://msdn.microsoft.com/en-us/library/bb982702.aspx
И увидел, что перечисленные прототипы:
template<class Fty, class T1, class T2, ..., class TN>
unspecified bind(Fty fn, T1 t1, T2 t2, ..., TN tN);
template<class Ret, class Fty, class T1, class T2, ..., class TN>
unspecified bind(Fty fn, T1 t1, T2 t2, ..., TN tN);
Что меня смущает по двум причинам. 1) В последний раз, когда я проверял, MSVC не реализовывал переменные шаблоны, и 2) Мой вопрос: что означает это слово unspecified
там? (Похоже, это не связано с неопределенным поведением.)
Ответ №1:
Неуказанный в возвращаемом типе означает, что это тип, который, ну, не указан. Стандарт не требует возврата определенного типа bind
, если возвращаемый тип соответствует требованиям, установленным стандартом.
На ...
данный момент я не знаю, реализует ли VS их или нет, но вы увидите ту же документацию для boost::bind
, и она уже некоторое время компилируется в разных компиляторах без поддержки переменных шаблонов… в документации указано, что вы можете передавать N
аргументы разных типов, но это не обязательно означает, что существует единый шаблон, который это делает, он может быть реализован в терминах набора 1-арных, 2-арных… N-арных шаблонов.
Документация показывает поведение, которое вы можете ожидать от его использования, а не детали того, как оно реализовано.
Комментарии:
1. О, я упустил из виду отсутствие возвращаемого типа. Вот и все.
Ответ №2:
Существуют отдельные перегрузки, которые ожидают аргументы {1, 2, …, N} . Вместо того, чтобы перечислять их все, в документации используется сокращение, чтобы показать, что вы можете использовать различное количество параметров. Это не предназначено для иллюстрации допустимого синтаксиса C . Я бы ожидал, что в документации где-нибудь будет указано, что такое N.
Тип результата зависит от переданных аргументов. Это будет некоторая форма функтора, и этот функтор, как правило, будет храниться в function
объекте, или вы можете передать результат непосредственно чему-то вроде for_each
и позволить вычитанию типа шаблона компилятора выяснить это. Пока результат можно вызвать, фактический тип не имеет значения, и было бы сложно попытаться кратко объяснить в документации.
Ответ №3:
Visual Studio не реализует переменные шаблоны. Они эмулируют концепцию, по сути, имея много перегрузок функции (вероятно, созданных с помощью макросов). Вот как boost::bind
это реализовано, откуда std::bind
и берется.
unspecified
Возвращаемый тип std::bind
является именно таким. Требуется, чтобы это был объект подвижного типа. Этот объект будет перегружен operator()
, так что std::bind
может быть вызвана функция, связанная с помощью.