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生成的闭包很容易,如图所示:只使用自动变量.但是假设我想创建一个这样的对象的向量.矢量包含什么类型?通常的答案是使用std :: function,但是在这种情况下不起作用,因为AFAIK没有多态std :: function这样的东西,即这在C 1y中是不合法的:
std::vector<std::function<auto(const auto&)>> vecOfPolymorphicClosures;
如果这是合法的,那么你可以做一些事情,比如创建一个回调容器,每个回调可以用任何一组参数调用,每个参数都可以返回一个依赖于传递的参数类型的类型.任何给定回调的结果都可以存储在自动变量中,至少在理论上是这样.
两个问题:
>在C 1y中是否有一种方法可以声明一个可以容纳不同类型的多态lambda的变量或容器(除了boost :: any之外)?
>希望这样的事情是可能的,或者这种事情是否与静态类型不兼容是否合理?
解决方法:
What I want to store are objects of different types, but each can be called with a potentially unlimited set of argument types.
翻译单位A:
// a.cpp
#include <cassert>
std::vector<magical_type> v;
struct lives_in_a { int i; };
// defined in TU B:
void prepare();
int main()
{
prepare();
assert( v.front()(lives_in_a { 42 }) == 42 );
}
翻译单位B:
// b.cpp
struct lives_in_b {
template<typename Anything>
int operator()(Anything const& a) const
{ return a.i; }
};
void prepare()
{
// ignore global initialization order fiasco for the sake
// of the argument
extern std::vector<magical_type> v;
v.push_back(lives_in_b {});
}
lives_in_b :: operator()< lives_in_a>的时间和地点实例化,以便可以调用它?
当使用参数lives_in_a {}调用v.front()时?在那种情况下,看不到lives_in_b的定义,甚至没有甚至实例化.
什么时候调用v.push_back(lives_in_b {})?在那种情况下,看不到对lives_in_a的定义,因此可能的实例化并没有多少.
这是一个演示,C的编译模型和方式模板实例化的特定组合工作,不允许该特定的愿望.它与静态类型关系不大.