18.1
//main.cpp
#include<iostream>
#include<initializer_list>
using namespace std;
template<typename T>
double average_list(initializer_list<T>i1)
{
int count = 0;
double sum=0;
for (auto p = i1.begin(); p != i1.end(); p++)
{
count++;
sum += *p;
}
return sum / count;
}
int main()
{
auto q = average_list({ 15.4,10.7,9.0 });
cout << q << endl;
cout << average_list({ 20,30,19,17,45,38 }) << endl;
auto ad = average_list<double>({ 'A',70,65,33 });
cout << ad << endl;
return 0;
}
18.2
//#pragma once
//Cpmv.h
#include<iostream>
#include<string>
using std::cout;
using std::endl;
class Cpmv
{
public:
struct Info
{
std::string qcode;
std::string zcode;
};
private:
Info *pi;
public:
Cpmv() { pi = nullptr; };
Cpmv(std::string q, std::string z);
Cpmv(const Cpmv &cp);
Cpmv(Cpmv &&mv);
~Cpmv();
Cpmv &operator=(const Cpmv&cp);
Cpmv &operator=(Cpmv&&mv);
Cpmv operator+(const Cpmv &obj)const;
void Display()const;
};
Cpmv::Cpmv(std::string q, std::string z)
{
pi = new Info;
pi->qcode = q;
pi->zcode = z;
}
Cpmv::Cpmv(const Cpmv &cp)
{
cout << "Cpmv(const Cpmv &cp)\n";
pi = new Info;
pi->qcode = cp.pi->qcode;
pi->zcode = cp.pi->zcode;
}
Cpmv::Cpmv(Cpmv &&mv)
{
cout << "Cpmv(Cpmv &&mv)\n";
pi = mv.pi;
mv.pi = nullptr;
}
Cpmv::~Cpmv()
{
delete pi;
}
Cpmv& Cpmv::operator=(const Cpmv&cp)
{
cout << "operator=(const Cpmv&cp\n";
if (this == &cp)
return *this;
delete pi;
pi = new Info;
pi->qcode = cp.pi->qcode;
pi->zcode = cp.pi->zcode;
return *this;
}
Cpmv& Cpmv::operator=(Cpmv&&mv)
{
cout << "operator=(Cpmv&&mv)\n";
if (this == &mv)
return *this;
delete pi;
//pi = new Info;//赋值语句将pi重新赋值
pi = mv.pi;
mv.pi = nullptr;
return *this;
}
Cpmv Cpmv::operator+(const Cpmv &obj)const
{
cout << "operator+(const Cpmv &obj)const\n";
Cpmv temp;
//delete temp.pi;
temp.pi= new Info;
temp.pi->qcode = pi->qcode + obj.pi->qcode;
temp.pi->zcode = pi->zcode + obj.pi->zcode;
return temp;
}
void Cpmv::Display()const
{
cout << "Display()const\n";
if (pi == nullptr)
cout << "pi=nullptr\n";
else
{
cout<<"address: "<<pi<< " qcode: " << pi->qcode
<< " zcode: " << pi->zcode << endl;
}
}
//main.cpp
#include<iostream>
#include"Cpmv.h"
int main()
{
using namespace std;
Cpmv cp1;
Cpmv cp2("c++", "programming language");
Cpmv cp3 = cp2;//左值引用的复制构造函数
cout << "cp1 ";
cp1.Display();
cout << "cp2 ";
cp2.Display();
cout << "cp3 ";
cp3.Display();
cp1 = cp2;//左值引用的赋值运算符
cout << "cp1 ";
cp1.Display();
cout << "cp2 ";
cp2.Display();
cp1=cp2 + cp3;//重载+,移动赋值运算符
cout << "cp1 ";
cp1.Display();
cout << "cp2 ";
cp2.Display();
cout << "cp3 ";
cp3.Display();
Cpmv cp4(cp1 + cp2);//重载+,移动构造函数
cout << "cp4 ";
cp4.Display();
cout << "cp1 ";
cp1.Display();
cout << "cp2 ";
cp2.Display();
return 0;
}
18.3
//main.cpp
#include<iostream>
long double sum_value() { return 0; };//递归终止条件,必须在模板函数前定义对模板函数可见
//否则递归时将不能使用该函数
template<typename T, typename...Args>
long double sum_value(T value, Args...args)
{
long double sum =(long double)value+(long double)sum_value(args...);//递归调用
return sum;
}
int main()
{
using namespace std;
cout << sum_value(12, 23, 65, 33)<<endl;
cout << sum_value('a', 'b', 23, 45, 'c')<<endl;
cout << sum_value(15.2, 35.3, 45.6, 'A')<<endl;
//cout << sum_value("you me", 'A', 23, 15.2)<<endl;//字符串类型的参数不能强制转化为浮点型出现编译错误
return 0;
}
18.4 未找到对应的函数