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

时间:2017-12-15 09:49:43

标签: c++

我希望有一个模板函数接受类型为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。我只希望我的函数接受TTypeX类型TypeY的一个参数,然后它必须区分输入以从X或{{调用相应的方法1}}。

2 个答案:

答案 0 :(得分:1)

我建议你改用动态多态。您可以通过虚函数继承实现此目的。首先,定义一个类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

答案 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);
   }
}

Example

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