c++ - 在 C++ 中使用接受单个对象作为参数的模板创建全局方法
问题描述
我有两个类 Circle{float getArea()} 和 Rectangle{ float getArea()}。这两个类互不相关。我想使用模板创建一个全局方法,该模板接受单个对象作为参数并显示相应对象的区域。
#include<iostream>
using namespace std;
template<class T>
class area
{
public:T getarea(T a);
T getarea(T a, T b);
};
template<class T>
T area<T>::getarea(T a)
{
return(3.14*a*a);
}
template<class T>
T area<T>::getarea( T a,T b)
{
return(a*b);
}
main()
{
area<float> a;
a.getarea(5);
a.getarea(2,4);
}
解决方案
只需将调用传递给对象:
#include<iostream>
class Circle{
private:
float m_r;
public:
Circle(float r): m_r(r) {}
float getArea() {return 3.14*m_r*m_r;}
};
class Rectangle{
private:
float m_a, m_b;
public:
Rectangle(float a, float b): m_a(a), m_b(b) {}
float getArea() {return m_a*m_b;}
};
class area {
public:
template<typename T>
// static float area:getarea(T a);
static decltype(std::declval<T>().getArea()) getarea(T a);
};
template<class T>
// float area:getarea(T a) {
decltype(std::declval<T>().getArea()) area::getarea(T a) {
return(a.getArea());
}
int main() {
Rectangle r(2, 4);
Circle c(5);
std::cout << area::getarea(r) << '\n';
std::cout << area::getarea(c) << '\n';
}
With decltype
/declval
的不同实例area::getarea
可以有不同的返回类型,具体取决于类。
推荐阅读
- swift - 如何在表格视图中以编程方式选择一行?(斯威夫特 4.0)
- javafx - Ubuntu 16.04 LTS 中 SceneBuilder 8.5.0 的问题
- c# - IHttpHandler - 从客户端检测到潜在危险的 Request.Form 值
- java - Java 8 流转换列表
到地图 > - python - 即使我更改类型,我的程序也将值计算为字符串而不是浮点数
- postgresql - PostGIS 升级 2.2.1 -> 2.5.0 数据库导入错误
- android - 如何绕过root设备的权限?
- go - Revel 依赖注入
- javascript - 如何从另一个 js 文件中获取 json 内容?
- javascript - Node.js / Socket.io 管理崩溃服务器(消息系统)