在c++ 11中,是否有一种方法来模板lambda函数?还是它本身就太具体了,无法被模板化?
我知道我可以定义一个经典的模板化类/函子,但问题更像是:语言是否允许模板化lambda函数?
在c++ 11中,是否有一种方法来模板lambda函数?还是它本身就太具体了,无法被模板化?
我知道我可以定义一个经典的模板化类/函子,但问题更像是:语言是否允许模板化lambda函数?
当前回答
c++ 11的另一个解决方法是定义一个模板函数并将其包装在lambda表达式中。然而;这需要为不同的模板化lambdas定义一个新函数:
struct ST{ int x; };
template<class T>
T templateFunc(T variable)
{
return variable;
}
void func()
{
ST st{10};
auto lambda = [&](){return templateFunc<ST>(st);};
auto res = lambda();
}
其他回答
我想知道这是怎么回事:
template <class something>
inline std::function<void()> templateLamda() {
return [](){ std::cout << something.memberfunc() };
}
我使用类似的代码,生成一个模板,不知道编译器是否会优化“包装”函数。
看看Boost。用于多态lambdas的Phoenix: http://www.boost.org/doc/libs/1_44_0/libs/spirit/phoenix/doc/html/index.html 顺便说一下,不需要c++ 0x:)
在c++ 11中,lambda函数不能被模板化,但是在下一个版本的ISO c++标准(通常称为c++ 14)中,将引入这个特性。(来源)
使用的例子:
auto get_container_size = [] (auto container) { return container.size(); };
注意,尽管语法使用了关键字auto,但类型推导不会使用auto类型推导的规则,而是使用模板参数推导的规则。另请参阅通用lambda表达式的建议(以及对此的更新)。
我知道这个问题是关于c++ 11的。然而,对于那些在谷歌上搜索并登陆这个页面的人来说,c++ 14现在支持模板化lambdas,并被称为泛型lambdas。
现在大多数流行的编译器都支持这个特性。微软Visual Studio 2015支持。叮当声的支持。GCC支持。
更新2018:c++ 20将带来模板化和概念化的lambdas。该特性已经集成到标准草案中。
更新2014:c++ 14已于今年发布,现在提供了与本例相同语法的多态lambdas。一些主要的编译器已经实现了它。
在c++ 11中,遗憾的是没有。多态lambdas在灵活性和功能方面非常出色。
它们最终变成单形的最初原因是因为概念。概念使这种代码情况变得困难:
template <Constraint T>
void foo(T x)
{
auto bar = [](auto x){}; // imaginary syntax
}
在一个受约束的模板中,只能调用其他受约束的模板。(否则约束将无法检查。)foo可以调用bar(x)吗?lambda有什么约束(毕竟它的参数只是一个模板)?
概念还没有准备好解决这类问题;它需要更多的东西,比如late_check(概念直到调用才被检查)等等。更简单的方法是放弃所有这些,坚持用单形。
然而,随着c++ 0x中概念的移除,多态lambda又变成了一个简单的命题。但是,我找不到任何建议。:(