【问题标题】:Template for both structures and functions?结构和功能的模板?
【发布时间】:2022-01-05 13:23:26
【问题描述】:

请看这个简短的函数:

void SEMTools::pack_CT_CMD(CT_CMD_t cmd)
{
    QByteArray payload(8, 0);
    uint8_t len, ide;
    int txId = Pack_CT_CMD_can(&cmd, reinterpret_cast<uint8_t *>(payload.data()), &len, &ide);
    QCanBusFrame txFrame = QCanBusFrame(txId, payload);
    _can->sendFrame(txFrame);
}

我需要大约 20 个这个“模板”函数,其中唯一改变的是:

  • CT_CMD_t,这是一个结构,我有20个不同的结构
  • Pack_CT_CMD_can,它是一个函数,我有20个不同的结构

我的目标是只写一个这样的函数(元代码):

void SEMTools::pack_CMD(<generic-struct> cmd, <generic-func> func)
{
    QByteArray payload(8, 0);
    uint8_t len, ide;
    int txId = func(&cmd, reinterpret_cast<uint8_t *>(payload.data()), &len, &ide);
    QCanBusFrame txFrame = QCanBusFrame(txId, payload);
    _can->sendFrame(txFrame);
}

那么,我会这样使用(还是元代码):

CT_CMD_t cmd1;
AB_CMD_t cmd2;

Pack_CT_CMD_can func1;
Pack_AB_CMD_can func2;

pack_CMD(cmd1, func1);
pack_CMD(cmd2, func2);

我不确定在这里使用template 是否是正确的方法,或者有更好的方法。

【问题讨论】:

  • 你有 20 个结构和 20 个函数,它们需要匹配吗,或者相同的结构可以与任何函数一起使用?
  • 每个结构都匹配其相关功能。它们不能混用。

标签: c++ templates


【解决方案1】:

听起来你需要一个带有 2 个参数的模板:

template<typename T, typename U>
void SEMTools::pack_CMD(T cmd, U func)
{
    QByteArray payload(8, 0);
    uint8_t len, ide;
    int txId = func(&cmd, reinterpret_cast<uint8_t *>(payload.data()), &len, &ide);
    QCanBusFrame txFrame = QCanBusFrame(txId, payload);
    _can->sendFrame(txFrame);
}

pack_CMD(cmd1, func1) 正常调用,让编译器推导出TU

您也可以将函数作为编译时非类型模板参数传递,例如像这样:

template<auto Fn, typename T>
void SEMTools::pack_CMD(T cmd)
{
    QByteArray payload(8, 0);
    uint8_t len, ide;
    int txId = Fn(&cmd, reinterpret_cast<uint8_t *>(payload.data()), &len, &ide);
    QCanBusFrame txFrame = QCanBusFrame(txId, payload);
    _can->sendFrame(txFrame);
}

调用为pack_CMD&lt;&amp;Pack_CT_CMD_can&gt;(cmd1)

【讨论】:

    猜你喜欢
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 2020-06-26
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    相关资源
    最近更新 更多