Преобразование в указатель на функцию является относительно новым: оно было введено с N3043 15 февраля 2010 года.
Хотя, например, GCC 4.5 реализует его, Visual Studio 10 был выпущен 12 апреля 2010 года и, таким образом, просто не реализовал его вовремя. Как указал Джеймс, в следующих выпусках будет исправлено .
На данный момент вы должны использовать одно из альтернативных решений, представленных здесь.
Технически, что-то вроде следующего обходного пути будет работать, но без шаблонов с переменными числами его не интересно обобщать (Boost.PP к спасению ...), и нет никакой защитной сетки от передачи лямбд в:
typedef uint64_t (*WeightFunc)(void* param);
template<class Func> WeightFunc make_function_pointer(Func& f) {
return lambda_wrapper<Func>::get_function_pointer(f);
}
template<class F> class lambda_wrapper {
static F* func_;
static uint64_t func(void* p) { return (*func_)(p); }
friend WeightFunc make_function_pointer<>(F& f);
static WeightFunc get_function_pointer(F& f) {
if (!func_) func_ = new F(f);
return func;
}
};
template<class F> F* lambda_wrapper<F>::func_ = 0;
// ...
WeightFunc fp = make_function_pointer([](void* param) -> uint64_t { return 0; });