C++ 打破可变参数模板参数循环

C++ break variadic template parameter loop

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

在下面的代码中,classB1、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;
}

&&短路。例如,如果匹配或不匹配,则使用 && 和 return 加入包。

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) && ...); 
}