根据输入类型选择正确的结构方法
Selecting correct method of struct based on input type
我想要一个接受 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
。我只希望我的函数接受一个TypeX
或TypeY
的T
类型的参数,然后它必须区分输入以调用相应的方法与X
或Y
.
我建议你改用动态多态性。您可以通过虚函数和继承来实现这一点。首先,定义一个用作抽象类的类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
。
从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);
}
}
例
在此之前,您可以尝试标记调度,但它需要编写更多代码。
相关文章:
- 通过方法访问结构
- 有什么方法可以遍历结构吗
- 没有为自己的结构调用列表推回方法
- 在 c++ 中拥有一组结构的正确方法是什么?
- 如何在方法中传递结构参数
- 对结构方法的未定义引用
- 不同的类或结构初始化方法之间的性能差异是什么?
- 让编译器告诉什么确切的纯虚拟方法使结构抽象?
- 我想直接在结构中插入,但没有一种方法可以正确避免填充问题
- 在C++中更改结构内部元素的方法?
- 学习数据结构和算法的简单方法
- 类方法 - 数据结构中 For 循环的运行时错误
- 如何从 node-ffi 调用 c++ 中以结构向量作为参数的方法?
- 哪一个是最好的方法类或结构?在 C++ 中
- 将一种数据类型的向量复制到同一数据类型的结构向量中的有效方法是什么
- 结构/方法不起作用
- 根据输入类型选择正确的结构方法
- C++结构方法语法
- 不同参数计数的结构方法列表
- 一个c++语法问题(一种结构方法)