Я хочу автоматическое вычитание аргументов шаблонной функции, которая принимает функцию при использовании lambdas. Этот пример показывает некоторые из моих вариантов:VS2012 жалуется при использовании + [] {} колдовства
template <class T>
void foo(void (*func)(T)) {
T val;
// do something with val and func...
}
int main() {
auto pfunc0 = [] (int) { /*...*/ };
void (*pfunc1)(int) = [] (int) { /*...*/ };
auto* pfunc2 = +[] (int) { /*...*/ };
foo(pfunc0); // not ok
foo<int>(pfunc0); // ok, but redundant
foo(pfunc1); // ok, but redundant
foo(pfunc2); // ok
}
pfunc2 использует трюк я узнал здесь: Obtaining function pointer to lambda?. Поэтому на самом деле я должен быть доволен случаем pfunc2, так как это краткий и не повторяющийся код, к сожалению, Visual C++ 2012 IDE жалуется, что это был ошибочный код, хотя он компилируется просто отлично.
Есть ли обходные пути или рекомендации по этой проблеме?
IDE Сообщения об ошибках:
В строке "авто * pfunc2": IDE подчеркивает 'Auto' и говорит
Error: cannot deduce 'auto' type
также он подчеркивает '[', где его жалобы
Error: more than one conversion function from "lambda[]void (int)->void" to a build-in type applies: function "lambda[]void (int)->void::operator void (*)(int)() const" function "lambda[]void (int)->void::operator void (*)(int)() const" function "lambda[]void (int)->void::operator void (*)(int)() const"
У меня нет доступа к VS2012, но вы пробовали 'Foo (+ pfunc0);'? – krzaq
@krzaq Я обновил свой вопрос с сообщениями об ошибках. Я попробовал ваше предложение, но ничего не изменил (те же сообщения об ошибках). – testman
@testman Плохо, я полностью пропустил это! – Quentin