下面的代码当然给出了交叉/跳转标签初始化编译错误。但是我怎样才能得到我想要达到的效果呢?也就是只实例化我真正需要的类,然后泛型调用所有类通用的方法?
A 类和 B 类实际上不在我的代码中,而是在我正在使用的大型库中,因此无法更改以提供帮助。他们不是超类的孩子(这将解决问题)。
两个真实类都处理相似的数据,因此以下面说明的方式与 filter() 方法兼容。我知道一些丑陋的 C hack 可以用来使它工作,但我正在寻找 C++ 惯用的解决方案。
在真正的问题中,有更多的代码和更多的案例,并且构造函数和类方法是资源密集型的,所以我不能“以防万一”初始化所有可能的类,然后选择正确的 filter() 方法用开关()。
#include <string>
#include <iostream>
class A {
public:
std::string msg;
A(std::string s) { msg = s;}
void filter() { std::cout << "Message A = " << msg << std::endl;}
};
class B {
public:
std::string msg;
B(std::string s) { msg = s;}
void filter() { std::cout << "The B message: " << msg << std::endl;}
};
int main() {
int type = 1;
switch (type) {
case 1:
A f("hi from A");
break;
case 2:
B f("hello from B");
break;
}
f.filter();
}
编辑:根据@stefan 的回答,我将代码修改为如下所示。我还没有在实际情况下尝试过,但我相信它会起作用。(谢谢大家!)
#include <string>
#include <iostream>
class A {
public:
std::string msg;
A(std::string s) { msg = s;}
void filter() { std::cout << "Message A = " << msg << std::endl;}
};
class B {
public:
std::string msg;
B(std::string s) { msg = s;}
void filter() { std::cout << "The B message: " << msg << std::endl;}
};
template <class F>
void doFilterStuff(std::string msg) {
F f(msg);
f.filter();
}
int main() {
for (int i=1; i<4; i++) {
std::cout << "Type = " << i << std::endl;
switch (i) {
case 1:
doFilterStuff<A>("hi from A");
break;
case 2:
doFilterStuff<B>("hello from B");
break;
default:
std::cout << "Throwing an error exception" << std::endl;
}
}
}