2013-04-23 4 views
2

Это работает:C++ шаблон не типа аргумент функции лямбда

#include <functional> 

template < bool (*F)(int) > class Foo {}; 

bool fooFunc(int n) { return true; } 

int main(int argc, char* argv[]) 
{ 
    auto a = Foo<fooFunc>(); 
} 

, но это не работает, потому что вы не можете преобразовать лямбда указателю функции:

#include <functional> 

template < bool (*F)(int) > class Foo {}; 

auto barFunc = [] (int n) -> bool { return true; }; 

int main(int argc, char* argv[]) 
{ 
    auto a = Foo<barFunc>(); 
} 

и это не работает, потому что вы не можете использовать зЬй :: функцию <> в качестве параметра шаблона не типа:

#include <functional> 

template < std::function< bool(int) > F > class Bar {}; 

auto barFunc = [] (int n) -> bool { return true; }; 

int main(int argc, char* argv[]) 
{ 
    auto b = Bar<barFunc>(); 
} 

так как I Crea te класс шаблона, который может принять лямбда-корпус в качестве параметра шаблона шаблона?

+0

Обратите внимание, что вы подразумеваете под параметром шаблона не-типа. Вы имеете в виду не просто размещение шаблона '? Не потому ли, что это слишком сильно смягчает требования к параметрам шаблона для ваших нужд? – OlivierD

+1

Он означает параметр ** ** ** (в отличие от типа), например: 'template ' –

+0

Я думаю, что вы пытаетесь что-то сделать во время компиляции, которое невозможно сделать в общем случае до запуска , поэтому «вы не можете использовать std :: function <> как параметр непигового шаблона» – antlersoft

ответ

5

Просто создайте шаблон класса с параметром типа и используйте decltype, чтобы вывести тип лямбды при создании экземпляра шаблона.

#include <functional> 

template <typename Function> 
class Bar 
{ }; 

auto barFunc = [] (int n) -> bool { return true; }; 

int main() 
{ 
    auto b = Bar<decltype(barFunc)>(); 
} 


Но обратите внимание, что лямбды не по умолчанию конструктивны, так что вам, вероятно, нужно добавить больше коды, чтобы создать конструктор, который принимает Bar в копии лямбды:

template <typename Function> 
class Bar 
{ 
    public: 

    Bar(Function f) : m_function(f) 
    { } 

    private: 

    Function m_function; 
}; 
0

В первом примере вам нужно добавить указатель, потому что функция не распалась на один.

+0

Интересно. Почему '' (0) 'необходимо в' std :: add_pointer :: type (0) '? – Ali

Смежные вопросы