【发布时间】:2020-02-08 00:22:52
【问题描述】:
我用 C++ 编写了不同的函数对象 A、B 和 C,我想根据用户输入用其中一个函数对象实例化一个模板类。但似乎没有办法只实例化 if 语句中的一种类型,是吗?
如果我尝试在 if 语句中使用模板实例化一个类,g++ 编译器会给我一个“使用未声明的标识符 'bkt'”的错误。如果我事先实例化它,该类会在离开 if 语句时自行销毁。
这是我的代码:
class A {
public: void operator()(int a) {}
};
class B {
public: void operator()(int a) {}
};
class C {
public: void operator()(int a) {}
};
template <typename T>
class MyClass {
public:
MyClass<T>(const std::string &file);
~MyClass<T>;
private:
T m_func;
int doStuff(int a) {
return m_func(a);
}
};
int main() {
std::string filename = std::string(argv[1]);
std::getline(std::cin, metric);
if (metric == "A") {
MyClass<A> foo(filename);
}
else if (metric == "B") {
MyClass<B> foo(filename);
}
else {
MyClass<C> foo(filename);
}
int a = 1;
foo.doStuff(int a); // undeclared identifier "foo"
getchar();
return 0;
}
我知道,我必须以某种方式声明 foo 变量,但我希望编译器可以接受它,因为 if 语句的一种情况无论如何都会发生。显然不是,那么我该怎么做才能不实例化每种类型?
【问题讨论】:
-
真的必须是模板参数吗?您的不同指标似乎都是同一类型,这仅仅是由于示例的简化吗?如果不是,我建议删除模板。在运行时选择模板实例化并不是模板真正发挥作用的地方。模板必须在编译时实例化
-
不好意思马虎,它们当然不是同类型的,但是简单的重构就可以做到,而与模板保持一致则需要更多的努力
-
您可以在度量评估之前声明
int a = 1;,然后在每个if语句中调用foo.doStuff(a);(我知道这是代码重复,但如果没有重构,我看不到另一种方法) . 注意:您必须在foo.doStuff()调用中提供a而不是int a。 -
@foreknownas_463035818 使用模板是要求的一部分。 Annnd 是的,这些函数实际上做了非常不同的事情(它是声明哪个字符串度量 (en.wikipedia.org/wiki/String_metric) 用于自动更正)...