参考:
- 《Essential C++》
#include <iostream>
#include <vector>
using namespace std;
const vector<int> *fibon_seq(int size);
const vector<int> *line_seq(int size);
// 给函数指针赋初值,防止错误调用。
bool seq_elem(int pos, int &elem, const vector<int> *(*seq_ptr)(int) = 0)
{
// 检验函数指针是否为空。
if (!seq_ptr)
{
cerr << "Internal Error: seq_ptr is set to null" << endl;
return false;
}
const vector<int> *psed = seq_ptr(pos);
if (!psed)
{
elem = 0;
return false;
}
elem = (*psed)[pos - 1];
return true;
}
//定义一个存储函数指针的数组。
const vector<int> *(*seq_array[])(int) = {
fibon_seq, line_seq};
int main()
{
const vector<int> *(*seq_ptr)(int);
for (int i = 0; i < 2; ++i)
{
seq_ptr = seq_array[i];
int res = 0;
if (seq_elem(8, res, seq_ptr))
{
cout << "#" << i+1 << " res: " << res << endl;
}
}
return 0;
}
const vector<int> *fibon_seq(int size)
{
const int max_size = 1024;
static vector<int> elems;
if (size <= 0 || size > max_size)
{
cerr << "fibon_seq(): oops: invalid size: "
<< size << " -- can't fulfill request.\n";
return 0;
}
for (int ix = elems.size(); ix < size; ++ix)
{
if (ix == 0 || ix == 1)
{
elems.push_back(1);
}
else
{
elems.push_back(elems[ix - 1] + elems[ix - 2]);
}
}
return &elems;
}
const vector<int> *line_seq(int size)
{
const int max_size = 1024;
static vector<int> elems;
if (size <= 0 || size > max_size)
{
cerr << "liner_seq(): oops: invalid size: "
<< size << " -- can't fulfill request.\n";
return 0;
}
for (int ix = elems.size(); ix < size; ++ix)
{
elems.push_back(ix);
}
return &elems;
}
输出结果:
#1 res: 21
#2 res: 7