练习11.11:不使用decltype重新定义bookstore。
/*
*C++Primer(第五版)
*11.2.2节练习
*练习11.11
*问题描述:练习11.11:不使用decltype重新定义bookstore。
* 说明:这道题是让你明白decltype(compareIsbn)*的类型究竟是什么,顺便复习了一下函数指针的内容
*作者:Nick Feng
*邮箱:nickgreen23@163.com
*/
#include <iostream>
#include <set>
#include "Sales_data.h"
using namespace std;
bool compareIsbn(const Sales_data &lhs, const Sales_data &rhs)
{
return lhs.isbn() < rhs.isbn();
}
int main()
{
//注释的地方为原始定义
//multiset<Sales_data,decltype(compareIsbn)*> bookstore(compareIsbn);
bool (*pf)(const Sales_data &,const Sales_data &) = compareIsbn;
//pf是指向compareIsbn函数的指针
//F是函数类型,不是指针,F*是一个带指针的复合类型,参考P223页
using F = bool(const Sales_data &,const Sales_data &);
multiset<Sales_data,F*> bookstore(compareIsbn);
}
Sales_data.h
/*
*练习7.6
*2015/7、1
*问题描述:练习7.6:对于add, read和print,定义你自己的版本。
*功能:完善之前的类,定义成一个头文件
*作者:Nick Feng
*邮箱:nickgreen23@163.com
*
*/
#ifndef SALES_DATA_H
#define SALES_DATA_H
#include <iostream>
#include <string>
using namespace std;
struct Sales_data{
string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
string isbn() const {return bookNo;}
Sales_data& combine(const Sales_data&);
double avg_price() const;
};
double Sales_data::avg_price() const{
if(units_sold)
return revenue/units_sold;
else
return 0;
}
Sales_data& Sales_data::combine(const Sales_data &rhs){
units_sold += rhs.units_sold;
revenue += rhs.revenue;
return *this;
}
Sales_data add(const Sales_data&, const Sales_data&);
ostream &print(ostream&, const Sales_data&);
istream &read(istream&, Sales_data&);
istream &read(istream &is, Sales_data &item)
{
double price = 0;
is >> item.bookNo >> item.units_sold >> price;
item.revenue = price * item.units_sold;
return is;
}
ostream &print(ostream &os, const Sales_data &item)
{
os << item.isbn() << " " << item.units_sold<< " "
<< item.revenue<< " " << item.avg_price();
return os;
}
#endif