C++ 中断可变参数模板参数循环

Tao Li

有没有办法尽早打破可变参数模板参数循环。例如,在下面的代码中,我想在不调用B2和B3类型的ProcessInvoke函数的情况下退出进程b1之后的进程函数。

在以下代码中,类 B1、B2、B3 继承了 B 及其唯一 ID。模板化处理函数能够处理 B1、B2、B3 处理逻辑。但是,当前的实现需要循环所有模板参数。为了提高效率,我们希望在第一个匹配的 id 上打破循环。

谢谢。

#include <iostream>
#include <string> 
  
class A {
public:    
    virtual ~A() {}    
    virtual int GetID() const  = 0;
};
   
template <int ID_>
class B : public A {   
public:
    enum { ID = ID_ };

    int GetID() const override { return ID;}   
};
  
class B1 : public B<1> {
public:
    const std::string name_ = "B1";
};

class B2 : public B<2> {
public:
    const std::string name_ = "B2";
};

class B3 : public B<3> {
public:
    const std::string name_ = "B3";
};
  
template<class T>
void ProcessInvoke(const A &a)
{
    std::cout << "Check Type " << T::ID << std::endl;

    if (a.GetID() == T::ID) { 
        std::cout << "Process " << a.GetID() << " OK" << std::endl;
    }
}
    
template<class...T>
void Process(const A &a) {    
    int dummy[] = { 0, (ProcessInvoke<T>(a), void(), 0)... };       
    static_cast<void>(dummy);    
}

int main()
{
    B1 b1;
    B2 b2;
    B3 b3;

    Process<B1, B2, B3>(b1);

    return 0;
}
卡米尔库克

&&是短路。例如&&,如果匹配或不匹配,则加入包并返回。

template<class T>
int ProcessInvoke(const A &a)
{
    std::cout << "Check Type " << T::ID << std::endl;
    if (a.GetID() == T::ID) { 
        std::cout << "Process " << a.GetID() << " OK" << std::endl;
        return 0;
    }
    return 1;
}
    
template<class...T>
void Process(const A &a) {
    (ProcessInvoke<T>(a) && ...); 
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章