我希望有一个模板函数接受类型为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
。我只希望我的函数接受T
或TypeX
类型TypeY
的一个参数,然后它必须区分输入以从X
或{{调用相应的方法1}}。
答案 0 :(得分:1)
我建议你改用动态多态。您可以通过虚函数和继承实现此目的。首先,定义一个类Base
,它用作抽象类:
class Base {
public:
virtual void Do() = 0;
};
X
和Y
都来自此类Base
。 X
和Y
都必须实现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
(即:X
或Y
)以根据输入类型进行实例化,然后将该对象的地址指定给指向Base
的指针,然后调用Do()
:
Base *p = // <-- address of struct X or struct Y object
p->Do();
将根据您实例化的对象的类型调用正确的Do()
成员函数:struct X
或struct Y
。
答案 1 :(得分:1)
自 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);
}
}
在此之前,您可以尝试使用标记调度,但需要更多代码才能编写。