// function.cpp :
/*
测试例子演示了函数指针的的各种组合以及调用的方式
如果你的编译器编译失败,请尽可能的先去掉 const 后编译,如果全部去掉后
还是编译失败,请把你的编译器升级到最高版本或者换了它。
*/
#include "stdafx.h"
#include "stdafx.h"
#include <functional>
#include <string>
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
//for _1, _2, _3...
using namespace std::placeholders;
template<class T1,class T2> const T1 my_strcat(const T1 &t1,const T2 &t2)
{
return std::move(t1 + t2);
}
struct Null_class{};
template<class _Fun,class v0_t = Null_class,class v1_t = Null_class,class = Null_class> class _Bind_A;
template<class _Fun,class v0_t> class _Bind_A<_Fun,v0_t>
{
private:
_Fun m_v;
public:
_Bind_A(_Fun v):m_v(v)
{
//
}
const std::string my_strcat(v0_t &v)
{
return m_v + v;
}
};
void test_bind()
{
std::string s1 = "aaa",s2 = "BBB",ss = "";
ss = std::bind(my_strcat<std::string,std::string>,s1,s2)();
std::cout<<ss<<endl;
/*
函数类型 (*指针变量名)(形参列表);“函数类型”说明函数的返回类型, 由于“()”的优先
级高于“*”,所以指针变量名外的括号必不可少;如果是类成员函数的指针,*前面需要加
类名::限定范围,类似这样:函数类型 (类名::*指针变量名)(形参列表);如果是模版类,
还需要指明模版参数类型;
*/
//全局模板函数指针
typedef const std::string (*FP)(const std::string&,const std::string&);
//全局模板函数指针的引用
typedef const std::string (&FR)(const std::string&,const std::string&);
//模板类模板成员函数指针
typedef const std::string (_Bind_A<std::string,std::string>::*CFP)(std::string&);
//模板类模板成员函数指针的引用,无法定义
//typedef const std::string (_Bind_A<std::string,std::string>::&CFR)(const std::string&);
FP fp = my_strcat<std::string,std::string>;
ss = fp(s1,s2);
std::cout<<ss<<endl;
fp = &my_strcat<std::string,std::string>;
ss = fp(s1,s2);
std::cout<<ss<<endl;
FR fr = my_strcat<std::string,std::string>;
ss = fr(s1,s2);
std::cout<<ss<<endl;
_Bind_A<std::string,std::string> bind_a(s1);
//c++ 2011 用 nullptr 代替指向空的指针
CFP cfp = nullptr;
//CFP cfp = 0;
cfp = &_Bind_A<std::string,std::string>::my_strcat;
//通过.调用
ss = (bind_a.*cfp)(s2);
std::cout<<ss<<endl;
//通过->调用
ss = (&bind_a->*cfp)(s2);
std::cout<<ss<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
test_bind();
system("pause");
return 0;
}
/*
输出:
aaaBBB
aaaBBB
aaaBBB
aaaBBB
aaaBBB
aaaBBB
请按任意键继续. . .
*/