【发布时间】:2019-06-06 09:03:47
【问题描述】:
我想打印多种类型的变量。我创建了一个名为IStringable 的类,以及一些派生自它的类。在我的PrintVariable 函数中,我想检查参数是否源自IStringable,如果是,则打印它。
class IStringable {
public:
virtual ~IStringable() { }
virtual std::string ToString() const = 0;
}
class Person : public IStringable {
public:
Person(const std::string name) : _name(name) { }
virtual std::string ToString() const { return _name; }
private:
std::string _name;
}
// This does not work as intended, as I don't know how it could be implemented
template <>
void PrintVariable<IStringable>(const IStringable& var) {
std::cout << var.ToString() << std::endl;
}
int main() {
Person p("Foo");
PrintVariable(p);
}
到目前为止,我只使用std::cout << p.ToString() << std::endl; 解决了这个问题,但我想知道是否有更好的解决方案。
【问题讨论】:
-
简单的
void PrintVariable(const IStringable& var) {}会做你所期望的。如果你试图将不是从IStringable派生的东西传递给这个函数,编译器会阻止你这样做。 -
您希望
PrintVariable也可以使用不是从IStringable派生的实例来调用吗?在这种情况下该函数应该做什么? -
是的。如果
PrintVariable被调用,例如int它应该在该 int 上使用std::string()以便将其转换为std::string以便它可以在std::cout中使用 -
我不敢写这个作为答案,但我认为你的方法存在根本缺陷。请求每个类型从
IStringable继承是相当侵入性的,并不是真正需要的。您通常为operator<<提供重载以便能够打印某些内容。另一方面,如果您想保留该界面,那么我仍然会选择operator<<,它可以调用相应的ToString,而不是您的PrintVariable
标签: c++ inheritance