模板化类对象的C ++矢量

时间:2018-08-22 07:07:30

标签: c++ class templates vector

我不知道是否有可能实现我正在尝试的目标,但是也许有人可以引导我朝着正确的方向发展。 Sidenote:这是在嵌入式系统上。

我有一个SPI通信,该通信返回代表一组寄存器的std::vector<int>。这是在一个单独的线程中完成的,因此可以异步进行。 为了解决这个问题,我在每个read调用中创建一个包含std::promise<std::vector<int>>(和一些其他信息)的对象,并直接返回其中的future,以便调用者可以等待结果。

一旦SPI传输完成,我将相应地设置promise的值。到目前为止一切顺利。

现在我想做的是不总是返回类型为std::vector<int>的future,而是对向量进行一些预处理并返回intdouble甚至是{ {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>

2 个答案:

答案 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);

请参见以下答案:

Vector that can have 3 different data types C++

答案 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();