我不知道是否有可能实现我正在尝试的目标,但是也许有人可以引导我朝着正确的方向发展。 Sidenote:这是在嵌入式系统上。
我有一个SPI通信,该通信返回代表一组寄存器的std::vector<int>
。这是在一个单独的线程中完成的,因此可以异步进行。
为了解决这个问题,我在每个read
调用中创建一个包含std::promise<std::vector<int>>
(和一些其他信息)的对象,并直接返回其中的future
,以便调用者可以等待结果。
一旦SPI传输完成,我将相应地设置promise的值。到目前为止一切顺利。
现在我想做的是不总是返回类型为std::vector<int>
的future,而是对向量进行一些预处理并返回int
或double
甚至是{ {1}}。
我以为可以通过将匿名函数传递给struct
函数并将引用存储在对象中来实现。然后会在分配承诺之前调用此函数。
我现在遇到的问题是此函数的返回类型直接影响我的promise的返回类型,并且存储它们的对象不再总是相同的。所以我以为只是模板
read
但是现在我不得不怀疑,包含这些template <class ret_type>
class obj{
public:
std::promise<ret_type> prms;
ret_type (*map_function)(std::vector<int>);
...
};
类型对象的向量(SPI队列)不能容纳不同类型的对象。
有解决这个问题的正确方法吗?
修改: 我会以类似的方式使用向量
std::vector<obj>
答案 0 :(得分:1)
注意:由于我没有足够的声誉来发表评论,因此我正在写一个答案。
如果可以使用C ++ 17,那么也许可以使用std :: any。 https://en.cppreference.com/w/cpp/utility/any
在C ++ 17之前,您可以创建一个多态类(定义基类,要返回和存储的不同类型的派生类),并将指向它们的指针存储在向量中。像这样:
vector<Base*> vec;
vec.push_back(derived1);
vec.push_back(derived2);
请参见以下答案:
答案 1 :(得分:1)
沼泽标准解决方案包括将整个类型更改部分移到虚拟函数中。在向量中存储(智能)指向基类的指针,并在派生类中实现虚函数。
class obj {
public:
virtual void set_promise () = 0;
};
template <class ret_type>
class obj_impl : public obj {
std::promise<ret_type> prms;
ret_type (*map_function)(const std::vector&<int>);
void set_promise () override {
std::vector<int> answer_from_spi = spi_read();
prms.set_value(map_function(answer_from_spi));
}
};
std::vector<std::unique_ptr<obj>> objects;
for(auto &element : objects)
element->set_promise();