美文网首页
[GeekBand][STL与泛型编程]第二周作业

[GeekBand][STL与泛型编程]第二周作业

作者: 散夜霜 | 来源:发表于2017-03-13 21:52 被阅读0次

1. 先上结果

20m
11200m
20s
10000s
10
请按任意键继续. . .

2. 源代码

文件1:Measurement-Test.cpp
#include <iostream>
#include "Measurement.h"
using namespace std;

int main()
{
    Measurement<meter> m1 = 20;
    Measurement<kilometer> m2 = 11.2;
    meter me = m1.description();

    Measurement<second> m3 = 20;
    Measurement<minute> m4 = 10;

    Measurement<double> m5 = 10;

    cout << me << endl;
    cout << m2.description() << endl;
    cout << m3.description() << endl;
    cout << m4.description() << endl;
    cout << m5.description() << endl;

    return 0;
}
文件2:Measurement.h
#ifndef __MEASUREMENT__
#define __MEASUREMENT__

#include <iostream>
#include <string>

template<typename T>
struct Measurement;
template<typename T>
struct Measurement_Traits;
struct meter;
struct kilometer;
struct second;
struct minute;
std::ostream& operator<<(std::ostream& os, const meter& m);
std::ostream& operator<<(std::ostream& os, const second& s);

template<typename T>
struct Measurement
{
    double data;
    typedef typename Measurement_Traits<T>::Unit_Type Unit_Type;
    Unit_Type description()
    {
        return Unit_Type(Measurement_Traits<T>::ratio*this->data);
    }
    Measurement(double x)
        :data(x)
    {}
};

template<typename T>
struct Measurement_Traits
{
    typedef double Unit_Type;
    static const double ratio;
};
template<typename T>
const double Measurement_Traits<T>::ratio = 1;

template<>
struct Measurement_Traits<meter>
{
    typedef meter Unit_Type;
    static const double ratio;
};

template<>
struct Measurement_Traits<kilometer>
{
    typedef meter Unit_Type;
    static const double ratio;
};

template<>
struct Measurement_Traits<second>
{
    typedef second Unit_Type;
    static const double ratio;
};

template<>
struct Measurement_Traits<minute>
{
    typedef second Unit_Type;
    static const double ratio;
};

struct meter
{
    double data;
    static const std::string unit_text;
    meter(double x) :data(x) {}
};

struct kilometer
{
    double data;
    static const std::string unit_text;
};

struct second
{
    double data;
    static const std::string unit_text;
    second(double x) :data(x) {}
};

struct minute
{
    double data;
    static const std::string unit_text;
};

#endif // !__MEASUREMENT__
文件3:Measurement.cpp
#include "Measurement.h"

const double Measurement_Traits<meter>::ratio = 1;
const double Measurement_Traits<kilometer>::ratio = 1000;
const double Measurement_Traits<second>::ratio = 1;
const double Measurement_Traits<minute>::ratio = 1000;
const std::string meter::unit_text = "m";
const std::string kilometer::unit_text = "km";
const std::string second::unit_text = "s";
const std::string minute::unit_text = "min";

std::ostream & operator<<(std::ostream & os, const meter & m)
{
    return os << m.data << m.unit_text;
}

std::ostream & operator<<(std::ostream & os, const second & s)
{
    return os << s.data << s.unit_text;
}

相关文章

网友评论

      本文标题:[GeekBand][STL与泛型编程]第二周作业

      本文链接:https://www.haomeiwen.com/subject/lxgqnttx.html