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) && ...);
}
有没有办法尽早打破可变参数模板参数循环。例如,在下面的代码中,我想退出进程 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) && ...);
}