【发布时间】:2020-10-21 10:35:35
【问题描述】:
我有一个带有 auto 参数的 lambda 函数,我想将参数推送到 STL 容器中(例如 std::vector)
例如:
template <typename T>
struct A
{
A(int a, T &&t): _a(a), _t(t){}
int _a;
T _t;
void work()
{
_t(this);
}
};
void test()
{
A a(3, [](auto a_ptr)
{
std::cout << a_ptr->_a << std::endl;
});
a.work();
}
这个例子很好用。
但是,如果我想保存 a_ptr 以供以后在向量中使用,我不知道在向量模板参数中要写什么。
我认为我什至不能在 lambda 的参数类型中使用 std::function 代替 auto,因为我认为 A 的类型是递归的(T 是接受 T 的 a 的 lambda...)
无论如何,这就是我想解决的方法,但想知道是否有更好的解决方案:
struct base_a
{
virtual void work() = 0;
};
template <typename T>
struct A : public base_a
{
A(int a, T &&t): _a(a), _t(t){}
int _a;
T _t;
virtual void work() override
{
_t(this);
}
};
void test()
{
std::vector<base_a *> v;
A a(3, [&v](auto a_ptr)
{
v.push_back(a_ptr);
std::cout << a_ptr->_a << std::endl;
});
a.work();
for (auto i: v)
{
i->work();
}
}
有解决这个问题的已知设计模式吗?
【问题讨论】:
-
向量必须具有相同类型的所有项。并且 lambda 没有已知类型。如果可能,请使用 std::tuple godbolt.org/z/Gd9jhe
-
你调用 work 多态所以你需要一个 vector
或 vector > 我会避免使用原始指针,特别是如果你拥有你的项目。 -
@doron,你是对的。在我的真实代码中,我确实使用了共享指针。这段代码只是一个简化的例子