我环顾四周,找不到我想要的东西。基本上,我想要一个专门使用基类的功能模板。我不知道如何使用专业功能。
含义...
class IBase
{
public:
virtual std::string func() const = 0;
};
class MyClass : public IBase
{
public:
std::string func() const { return "From MyClass"; }
};
template <class T>
std::string get_func(const T* t)
{
return "Unknown";
}
template <>
std::string get_func<IBase>(const IBase* t)
{
return t->func();
}
int main()
{
int a;
MyClass b;
get_func(&a); // <- Returns 'Unknown'. Good.
get_func(&b); // <- Returns 'Unknown'. Bad, want 'From MyClass'.
}
我使用 const T*
的原因是因为 IBase
是抽象的。
只是使用超载函数。
std::string get_func(const IBase *t) {
return t->func();
}
始终在模板之前选择重载功能。
在接受答案中使用函数过载来替换功能模板专业化并不总是一个好主意。对于问题中的示例代码,函数过载无法提供默认实现,该实现将为非专业类打印"未知"。功能超载不足的其他示例包括元组和几乎任何变异编程。
有关代码不起作用的主要原因是当前,类型扣除和转换不能彼此效果很好。您需要将&b
施加到其父类(即IBase*)的指针类型中。由于当前C 中的这个问题,有必要通过使用。
get_func((const IBase*)&b);
其次,最好将virtual
添加到
std::string func() const { return "From MyClass"; }
,由于IBase :: func定义为虚拟成员函数。(对于所有编译器而言,这并不是必需的:C 的"虚拟"派生类功能的关键字"。这是必要的吗?)。
随着这些更改,下面的代码输出预期:
Unknown
From MyClass
代码:
#include <string>
#include <iostream>
using namespace std;
class IBase
{
public:
virtual std::string func() const = 0;
};
class MyClass : public IBase
{
public:
virtual std::string func() const { return "From MyClass"; }
};
template <class T>
std::string get_func(const T* t)
{
return "Unknown";
}
template <>
std::string get_func<IBase>(const IBase* t)
{
return t->func();
}
int main()
{
int a;
MyClass b;
cout << get_func(&a) << endl; // <- Returns 'Unknown'. Good.
cout << get_func((const IBase*)&b) << endl; //
}