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

#c #lambda #c 11

#c #лямбда #c 11

Вопрос:

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

Допустим, у меня есть один из многих классов с функцией «magic», и только первые 2 параметра имеют значение для моего последующего вызова. После первых 2-х у него могут быть или не быть некоторые параметры по умолчанию. На самом деле они меня не волнуют для этого приложения, мне нужно только вызвать magic (start, otherthing). Uhoh является одним из этих классов:

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

Я выполняю вызов с помощью этого шаблона. Я должен использовать обходной путь использования типа auto, чтобы заставить 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>();
}
  

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

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

Ответ №1:

 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) .

Комментарии:

1. Я понимаю это. Я ищу способ не потерять его (возможно, используя function<>?), Но одновременно не зная тип 2-го аргумента, который я буду использовать. Параметры по умолчанию могут меняться в зависимости от разных «волшебных» функций. Я не могу быть настроен на использование только одного ее экземпляра.

2. @user173342 » Нет. Тип функции не может сохранить это значение.