根据输入类型选择正确的结构方法

Selecting correct method of struct based on input type

本文关键字:结构 方法 选择 输入 类型      更新时间:2023-10-16

我想要一个接受 T 类型的对象的模板函数,从中选择并运行正确类中的方法。 像这样的东西,

struct TypeX
{};
struct TypeY
{};
struct X
{
void Do(TypeX &r){}
};
struct Y
{
void Do (TypeY & r){}
};  
template<typename T>
void Do(T& r)
{
// if(T==TypeX) call X::Do(r)    
}

我的解决方案变成了

template<class V, typename T>
void Do(T& r)
{
V::Do(r);    
}

template<class B, typename T>
void Do(B*p, T& r)
{
p->Do(r);    
}

然而,它看起来有缺陷,例如 在我的main.cpp中,我必须创建一个B指针 要么作为B*p=new X;B*p=new Y而且我根本不喜欢动态分配或将B类型引入main。我只希望我的函数接受一个TypeXTypeYT类型的参数,然后它必须区分输入以调用相应的方法与XY.

我建议你改用动态多态性。您可以通过虚函数继承来实现这一点。首先,定义一个用作抽象类的Base

class Base {
public:
virtual void Do() = 0;
};

XY都将派生自此类BaseXY都必须实现Do()成员函数,否则无法实例化它们:

struct X: public Base {
// define your Do() function member for X
virtual void Do() override {
...
}
};
struct Y: public Base{
// define your Do() function member for Y
virtual void Do() override {
...
}
};

您根本不需要动态分配:

struct X x;
struct Y y;
Base *p = &x //or &y

您所要做的就是根据输入类型选择合适的struct(即:XY)进行实例化,然后将该对象的地址分配给指向Base的指针,然后调用Do()

Base *p = // <-- address of struct X or struct Y object
p->Do();

将根据您实例化的对象类型调用正确的Do()成员函数:struct Xstruct Y

C++17开始,您可以使用if constexpr

template<typename T>
void Do(T& r)
{
if constexpr (std::is_same_v<T, TypeX>) {
X::Do(r);
} else {
Y::Do(r);
}
}

在此之前,您可以尝试标记调度,但它需要编写更多代码。