一种处理连续且分段数字对象的代码框架

CANOpen协议栈中,不同的cob id段对应不同的功能,例如紧急报文、SDO、PDO等,因此可以利用如下结构进行抽象。


#include <iostream>
#include <vector>
#include <tuple>
#include <functional>
#include <utility>

template<int MIN, int MAX>
class A{
public:
    A()=default;
    virtual bool check(int value){return value > MIN && value < MAX;}
    virtual void name()=0;
};

class B : public A<1,3>{
public:
    // B()=default;
    void name(){std::cout<<"B"<<std::endl;}
};

class C : public A<4,5>{
public:
    void name(){std::cout<<"C"<<std::endl;}
};

template<typename T>
void exec_tuple(T t, int v){
    if(t.check(v)) t.name();
}

template<class Tuple, std::size_t... Is>
void print_tuple_imple(int v, const Tuple& t, std::index_sequence<Is...>){
    (exec_tuple(std::get<Is>(t), v), ...);
}

template<typename ...Args>
void print_tuple(int value, const std::tuple<Args...>&t){
    print_tuple_imple(value, t, std::index_sequence_for<Args...>{});
}

int main(int argc, char** argv){
    std::tuple<B,C> a;
    print_tuple(2, a);
    return 0;
}

程序输出:B

posted @ 2024-06-04 17:59  yinsua  阅读(1)  评论(0编辑  收藏  举报