Вызов статической функции из параметра шаблона в лямбда-функции при игнорировании параметров по умолчанию - PullRequest
0 голосов
/ 13 ноября 2011

Хорошо, я использую Visual Studio 2010, чтобы связываться с лямбдами в шаблонах.В VC ++ есть странная причуда, связанная с параметрами шаблона, но я нашел обходной путь для вызова статической функции параметра шаблона (в данном примере T :: magic) с помощью ключевого слова auto.Однако я столкнулся с другим препятствием.

Скажем, у меня есть один из многих классов с функцией "магия", и только первые 2 параметра имеют значение для моего вызова позже.Он может иметь или не иметь некоторые параметры по умолчанию после первых 2-х. Меня это не особо интересует для этого приложения, мне нужно только вызвать магию (запуск, другое).Uhoh - один из этих классов:

struct Uhoh
{
 static int magic(char* start, int otherthing, bool doom = false);
}

Я делаю вызов с этим шаблоном.Я должен использовать обходной путь использования автоматического типа, чтобы заставить T :: magic для него работать в лямбда-функции.

template<typename T> void example()
{
 auto themagic = T::magic;

 std::function<int (char*)> test = [=](char* start) -> int
 {
  return themagic(start, 0);
 };

 test(0);
}

А потом я звоню или как угодно.

int main()
{
 example<Uhoh>();
}

Я получаю сообщение об ошибке "слишком мало аргументов для вызова", хотя "магия" может принимать два аргумента.Теперь я не могу точно знать, какой будет тип для «другого» в любой из «магических» функций.Все, что я знаю, это то, что 0 будет допустимым значением.Передача типа того, что еще будет в функцию «пример», в лучшем случае будет крайне раздражающим.

Как правильно набрать «themagic», чтобы VC ++ не выдавал ошибку?

1 Ответ

2 голосов
/ 13 ноября 2011
auto themagic = T::magic;

Здесь информация о том, что третий параметр T::magic имеет значение по умолчанию, теряется, так как тип themagic выводится как int (*)(char*, int, bool), который не может иметь какое-либо значение по умолчанию длятретий параметр.Таким образом, вы не можете вызвать themagic только с двумя аргументами.Вы также должны передать третий аргумент.

Так сделайте это:

std::function<int (char*)> test = [=](char* start) -> int
{
  return themagic(start, 0, false);
};

Обратите внимание, что значением по умолчанию для параметра функции является , а не частьсигнатура функции, которая означает, что когда вы пишете

auto themagic = T::magic;

, тип themagic не может быть выведен как int (*)(char*, int, bool=false).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...