c++ - 结构的通用类型

标签 c++ qt

给定以下两种方法:

QVector<QPointF> DataProvider::getPointsSize()
{
  QVector<QPointF> points;
  foreach (Database::TbRawInItem item, rawInData)
    points << QPointF(item.timestamp.toTime_t(), item.data.size());
  return points;
}

QVector<QPointF> DataProvider::getPointsPacketCounter()
{
  QVector<QPointF> points;
  foreach (Database::BeaconItem item, beaconData)
    points << QPointF(item.timestamp.toTime_t(), item.packetCounter);
  return points;
}

我想将其改进为 getPoints 方法,该方法将被调用以传递 foeach 参数。像这样:

getPoints(TbRawInItem, rawInData);
getPoints(BeaconItem, beaconData);

类成员rawInDatabeaconData定义为:

QVector<Database::TbRawInItem> rawInData;
QVector<Database::BeaconItem> beaconData;

item 是一个结构体:

struct TbRawInItem {
  unsigned int id;
  QDateTime timestamp;
  QByteArray data;
  char interface;
};
struct BeaconItem {
  QDateTime timestamp;
  unsigned int packetCounter;
  unsigned int cmdRxCounter;
  unsigned int cmdValidCounter;
  double battVoltage;
  double totalSysCurrent;
  double battTemperature;
  double photoVoltaicVoltage1;
  double photoVoltaicVoltage2;
  double photoVoltaicVoltage3;
  double photoCurrent;
};

我的问题是如何处理item结构?

最佳答案

unsigned int getSize(Database::TbRawInItem const &item) {
  return item.data.size();
}

unsigned int getSize(Database::BeaconItem const &item) {
  return item.packetCounter;
}
// you need to create an overload for each type of item
// If you have many item types and some of them get the size the same way
// you can group them together (just one function for all) with
// templates and SFINAE
// That is an advanced tehnique though.

template <class T>
QVector<QPointF> DataProvider::getPoints(T const &data) {
  QVector<QPointF> points;
  foreach (T item, data)
    points << QPointF(item.timestamp.toTime_t(), getSize(data));
  return points;
}

getPoints(rawData); // T will be deduced as Database::TbRawInItem
getPoints(beaconData); // T will be deduced as Database::BeaconItem

或使用 lambda:

template <class T, class Func>
QVector<QPointF> DataProvider::getPoints(T const &data, Func const &get_size)    {
  QVector<QPointF> points;
  foreach (T item, data)
    points << QPointF(item.timestamp.toTime_t(), get_size(data));
  return points;
}

getPoints(rawData, [](Database::TbRawInItem const &item) {
    return item.data.size();}));
getPoints(beaconData, [](Database::BeaconItem const &item) {
    return item.packetCounter;}));

或介于两者之间


免责声明:

  • 我不熟悉 foreach 我想它是 qt 的东西。尽管如此,它的概念是相同的。
  • 我没有编译它,因为我没有 MCVE因此可能存在语法错误。

关于c++ - 结构的通用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27847683/

相关文章:

c++ - 如何将 LPCWSTR 转换为 const char *?

c++ - 用Qt序列化,不用Qt反序列化?

linux - Qt 蓝牙与 Linux

c++ - 如何只关闭一个 GLUI 窗口

c++ - 用于获取最大值及其在 vector 中的相应索引的模板函数

c++ - 根据抽象工厂中可用的重载版本自动选择构造函数

c++ - 如何将文件添加到 Codelite 中的现有项目?

c++ - 请求或 AccessManager QT

c++ - 在 linux 和 mac 上始终将应用程序窗口保留在当前桌面上

c++ - Qt 项目中损坏的按位或运算符