首页 > 解决方案 > 在 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);
}

标签: c++classtemplates

解决方案


只需将调用传递给对象:

#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可以有不同的返回类型,具体取决于类。


推荐阅读