c – 如何存储多态闭包?

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的编译模型和方式模板实例化的特定组合工作,不允许该特定的愿望.它与静态类型关系不大.

上一篇:c – 将基类型的STL容器转换为派生类型是否可以?


下一篇:java – 在父类之间来回转换后,子对象是否会丢失其唯一属性