【发布时间】:2019-02-24 02:05:14
【问题描述】:
我正在尝试创建一个可变参数模板类,其方法需要遍历模板参数并为每种类型调用一个不相关的模板函数。
这个想法是用特定的模板参数扩展这个模板类,以便封装基本行为。
一般想法的一个简单例子是这个(可怕的)Checker 类:
class Arg {
Arg() {};
virtual ~Arg() = default;
};
class A : public Arg{ /* ... */ };
class B : public Arg{ /* ... */ };
class C : public Arg{ /* ... */ };
template <typename ... SubClasses>
class Checker {
public:
Checker() {};
virtual ~Checker() = default;
bool isOneOf(Arg* base) const;
};
template <typename ... SubClasses>
bool Checker<SubClasses>::isOneOf(Arg* arg) const
{
// NOTE: I don't know how I would iterate over the class types....
for (auto SubClass : SubClasses...) { // <-- not valid code
if (std::dynamic_cast<SubClass>(arg)) {
return true;
}
}
return false;
}
class Whatever : public Checker<A, B> {};
auto whatever = new Whatever();
auto a = new A();
auto b = new B();
auto c = new C();
whatever->isOneOf(a); // true
whatever->isOneOf(b); // true
whatever->isOneOf(c); // false
为了让isOneOf 工作,它需要能够迭代模板参数
我正在使用 C++14 编译器,但我无法使用boost。
【问题讨论】:
标签: c++ templates variadic-templates