您的位置:首页 > 编程语言 > C语言/C++

[C++ 2011 STL (VS2012 Update4) 源代码阅读系列(3)]模板函数指针的的各种组合以及调用的方式

2013-08-12 16:50 597 查看
// 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

请按任意键继续. . .

*/

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐