【发布时间】:2013-10-29 23:32:17
【问题描述】:
C++1y 提供多态 lambda(即,使用 auto 作为参数类型的一部分):
int f(int);
double f(double);
std::string f(const std::string&);
auto funcObj = [](const auto& param){ return f(param); }
存储 lambda 生成的闭包很容易,如图所示:只需使用 auto 变量。但是假设我想创建一个vector 的此类对象。 vector 持有什么类型?通常的答案是使用std::function,但这在这种情况下不起作用,因为AFAIK没有多态std::function这样的东西,也就是说,这在C++ 1y中是不合法的:
std::vector<std::function<auto(const auto&)>> vecOfPolymorphicClosures;
如果这是合法的,那么你可以做一些事情,比如创建一个回调容器,每个回调容器都可以用任何一组参数调用,每个回调都可以返回一个依赖于传递参数类型的类型。至少在理论上,任何给定回调的结果都可以存储在auto 变量中。
两个问题:
- 在 C++1y 中是否可以声明一个变量或容器来保存不同类型的多态 lambda(
boost::any之类的除外)? - 是否有理由希望这样的事情成为可能,或者这种事情与静态类型不兼容?
【问题讨论】:
-
对于有限的类型列表,当然。无限?
-
理想情况下是无限列表,是的。例如,我希望能够创建一个容器,该容器可以容纳从采用相同数量参数的多态 lambda 创建的任何闭包。从概念上讲,这与
std::function并没有太大区别,std::function可以保存任何可调用的任何签名,并且与目标签名兼容。 -
decltype(funcObj):std::vector<decltype(funcObj)>或std::vector<decltype([](const auto& x){return x;})>怎么样?可能不会。 -
@John:您的方法将只允许持有一种类型的关闭。这不会很有用,因为每个闭包都有一个唯一的类型。
-
为了您的目的,Boost.Functional/OverloadedFunction 对于多态函子就像 Boost.Function 对于单态函子一样。如果一切都失败了,我会推荐 Boost.TypeErasure 作为更多自定义类型擦除的起点。
标签: c++ lambda polymorphism c++14