有没有办法尽早打破可变参数模板参数循环。例如,在下面的代码中,我想在不调用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] 删除。
我来说两句