Вопрос по c++11, c++ – Ограничивает ли C ++ 11 std :: function количество аргументов, которые может иметь указатель на функцию?

14

Я использую бета-версию Visual Studio 11, и мне любопытно, что из-за ошибки компиляции я получаю объект std :: function в моем классе.

<code>typedef std::function<void (int, const char*, int, int, const char*)> MyCallback;
</code>

У меня в классе,

<code>MyCallback m_callback;
</code>

Это компилируется просто отлично. Если я добавлю еще один аргумент в список, он потерпит неудачу.

<code>typedef std::function<void (int, const char*, int, int, const char*, int)> MyCallback;
</code>

Ошибка:

<code>>c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(535): error C2027: use of undefined type 'std::_Get_function_impl<_Tx>'
1>          with
1>          [
1>              _Tx=void (int,const char *,int,int,const char *,int)
1>          ]
1>          f:\development\projects\applications\my.h(72) : see reference to class template instantiation 'std::function<_Fty>' being compiled
1>          with
1>          [
1>              _Fty=void (int,const char *,int,int,const char *,int)
1>          ]
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(536): error C2504: 'type' : base class undefined
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(539): error C2027: use of undefined type 'std::_Get_function_impl<_Tx>'
1>          with
1>          [
1>              _Tx=void (int,const char *,int,int,const char *,int)
1>          ]
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(539): error C2146: syntax error : missing ';' before identifier '_Mybase'
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(539): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
</code>

Это динамически связанная библиотека, которая подготавливает данные для передачи в другое приложение. Я, конечно, могу переделать формат данных, чтобы их можно было передавать с меньшим количеством аргументов, но мне было интересно, почему я вижу этот предел?

Переключение обратно на указатель функции в стиле c,

<code> typedef void (*MyCallback)(int, const char*, int, int, const char*, int);
</code>

похоже, работает нормально.

Ваш Ответ

1   ответ
37

Спецификация C ++ дляstd::function не устанавливает никаких ограничений.std::function использует переменные шаблоны для работы с любым количеством аргументов. Реализации могут иметь ограничение, основанное, например, на границах вложенности экземпляра шаблона, но оно должно быть большим. Спецификация предлагает 1024 в качестве хорошего минимума поддерживаемой глубины вложенности и 256 в качестве хорошего минимума для аргументов, разрешенных, например, в одном вызове функции.

Visual Studio (по состоянию на VS11) не имеет шаблонов с вариацией. Они моделируют их до 5 аргументов в VS11, хотя вы можете изменить их до 10. Сделайте это, определив_VARIADIC_MAX в вашем проекте. Это может значительно увеличить время компиляции.

Обновление: VS 2012 Nov CTP добавляет поддержку шаблонов переменных, но стандартная библиотека еще не обновлена для их использования. После обновления вы сможете использовать столько аргументов, сколько захотите, используяstd::function.

Правильный ответ. Также смMagic && Secrets Сам STL на GoingNative 2012, он упоминает об этом один или два раза. Xeo
Отлично, это отвечает на мой вопрос, спасибо! BZor
@ phresnel На основании всех тестовых случаев с шаблонами variadic в gcc и трафика электронной почты и - ну - кодовой базы, я думаю, это было довольно сложно. Я думаю, что ребята, вовлеченные в его реализацию, начали очень рано в процессе разработки стандартов и включали людей (особенно Джейсона Меррилла), которые внесли значительный вклад в стандарт в этой област emsr
Интересная вещь. Я помню, как реализация шаблонов с переменными значениями была лишь незначительным усилием на стороне g ++. Sebastian Mach

Похожие вопросы