C++多方法和编译时检测
C++ multimethods and compile time detection
我有以下代码:
class A{};
class B: public A{};
class C: public A{};
class MyVisitor
{
public:
void visit(B*);
void visit(C*);
};
然后收集A*对象,我想实现如下:
1)
MyVisitor visitor;
for(vector<A*>::iterator it = vec.begin(); it!= vec.end();it++)
visitor->visit(a);
2) 以某种方式在编译时确定A*是否指向派生对象D,并给出编译器错误,如果MyVisitor::visit(D*)
函数不存在
我知道1)可以通过一些多方法实现,我想我可以找到一些c++的多方法实现。但有可能吗?
您可以像这样使用dynamic_cast
(在for
循环的主体中),因为行为在运行时应该有所不同(根据实际数据类型)。
ClassB* ba = dynamic_cast<ClassB*>(a);
if (ba)
visitor->visit(ba);
ClassC* ca = dynamic_cast<ClassC*>(a);
if (ca)
visitor->visit(ca);
也许您的visit
函数可能被声明为virtual
(用于ClassD
)。
否则,将您的类组织为类的树(而不是林),并拥有最顶端的根类
class Topmost {
virtual int classnum() const;
并采用约定,即每个非抽象类都给出其唯一的classnum
等。或者具有元类机制(例如Qt具有)
您可以尝试这样的方法。
#include <iostream>
class A
{
virtual void visit() = 0;
};
class B: private A
{
public:
void visit()
{
std::cout << __PRETTY_FUNCTION__ << "n";
}
};
class C: private A
{
public:
void visit()
{
std::cout << __PRETTY_FUNCTION__ << "n";
}
};
template <typename... Args>
class MyVisitor : public Args...
{
public:
template <typename T>
void visit(T* t)
{
t->visit();
}
};
int main()
{
MyVisitor<B, C> visitor;
B b;
B* bp = &b;
visitor.visit(bp);
return 0;
}
实例
您可以完全应用访问者模式:
class B;
class C;
class IVisitor
{
public:
void visit(B&) = 0;
void visit(C&) = 0;
};
class A
{
virtual ~A() = default;
virtual void accept(IVisitor& v) = 0;
};
class B: public A{ void accept(IVisitor& v) override { v.visit(*this); } };
class C: public A{ void accept(IVisitor& v) override { v.visit(*this); } };
相关文章:
- 编译的C可执行文件被Windows defender检测为病毒
- CodeLite 不会检测(安装)MinGW - 即使使用手动配置也不会编译
- 检测编译时文本和常量
- 如何在编译时检测C 17中是否没有虚拟基础
- 有没有办法在编译时检测是否可以使用一组给定的参数类型成功调用通用 lambda?
- 编译时未检测到主要功能
- 参数类型的编译时类型检测
- 使用SFINAE检测编译时间是否存在过载的独立式功能
- 如何在编译时检测 C++ 代码中的 SQL 错误
- 如何在编译时检测ABI
- 我可以检测编译时使用的标记调度重载吗?
- 如何检测编译时是否shared_ptr类型
- 检测或避免在编译时间上暂时提及暂时的提及
- 在编译时检测std :: size_t类型以调用正确的功能
- 编译共享对象时出错:未检测到C++类定义
- 在编译时检测是否存在默认构造函数
- 编译弃用电话的时间检测
- 是否可以在编译时间作为宏上检测GCC编译标志
- 检测编译时是否存在长长
- 在大型C++项目中,我应该如何检测编译时间的瓶颈