作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个可变参数模板类,其方法需要迭代模板参数并为每种类型调用不相关的模板函数。
这个想法是用特定的模板参数扩展这个模板类,以封装基本行为。
一般想法的一个简单示例是这个(糟糕的)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++14 解决方案(还有 C++11)是
template <typename ... SubClasses>
bool Checker<SubClasses...>::isOneOf (Arg * arg) const
{
using unused = bool[];
bool ret { false };
(void)unused { false, ret |= (nullptr != dynamic_cast<SubClasses *>(arg))... };
return ret;
}
不幸的是,当第一个为真时,所有的 nullptr != dynamic_cast
测试都被评估(如果编译器没有优化它)。
如果你能使用C++17,模板折叠就简单多了
template <typename ... SubClasses>
bool Checker<SubClasses...>::isOneOf (Arg * arg) const
{ return (... || (nullptr != dynamic_cast<SubClasses *>(arg)) ); }
关于c++ - Variadic 模板类遍历类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54848087/
我是一名优秀的程序员,十分优秀!