zoukankan      html  css  js  c++  java
  • template指针小测试

    测试结论:

    1 函数指针 -- 使用形参固定的一系列函数作为某个函数的形参 -- callback机制

    2 模板指针 -- 使用形参可变的一系列函数作为某个函数的形参 -- 

    3 typename -- 在有 struct 或者 class 的情况下,用于告知编译器,其后的,是一个 type(类型,就可以拿来定义变量等操作) ,而不是成员。

    测试代码:

    #include <iostream>
    #include <string>
    #include <vector>
    
    
    template <class T>
    void AddVariable(std::string Name ,T value)
    {
    	std::cout << Name << ", " << value << std::endl;
    }
    
    template <class T>
    void SetVariable(std::string Name, T value)
    {
    	AddVariable(Name, value);
    }
    
    template <class T> // 测试模板指针 Parameter 和 variable 是同级的
    void AddParameter(std::string Name, T value)
    {
    	std::cout << Name << ", " << value << std::endl;
    }
    
    template <class T> // 测试模板指针 Parameter 和 variable 是同级的
    void SetParameter(std::string Name, T value)
    {
    	AddParameter(Name, value);
    }
    
    
    // 函数和模板同名,先调用符合的函数
    void AddVariable(std::string Name, int value)
    {
    	std::cout << Name << ", " << value << std::endl;
    }
    
    void SetVariable(std::string Name, int value)
    {
    	AddVariable(Name, value);
    }
    
    // 函数指针  这里的 pfun 的形参是确定的。
    // 为了代表一系列相同形参的函数
    typedef void(*FunType)(std::string, int);
    void SetVariableByFunPtr (FunType pfun, std::string name, int value)
    {
    	pfun(name, value);
    }
    
    // 模板指针  不能使用函数指针,因为这里的 pfun 的形参应该是不确定的。
    // 所以 FunType 的定义要改变
    // 为了代表一系列相同形参的模板
    template <class T>
    struct Type 
    {
    	typedef void (*FunType)(std::string name, T value);
    };
    
    // template <class T> typedef void(*FunType)(std::string name, T value); // 错!typedef 模板,非法
    
    
    // typename 用于说明这是一个 type(可以定义变量) 而不是成员(不可以定义变量)。
    template <class T>
    void SetVariableByTemplatePtr(typename Type<T>::FunType pfun, std::string name, T value)
    {
    	std::vector<T> vecT(10);
    	pfun(name, value);
    }
    
    
    int main()
    {
    	//SetVariable("Score: ", 128); // call function
    	//SetVariable("Score: ", 123.98); // call template
    	//SetVariableByFunPtr(SetVariable, "Score: ", 123);			// 函数形参类型固定  函数指针
    	//SetVariableByFunPtr(SetVariable, "Score: ", 129.98);		// 函数形参类型固定  129.98被截断成129,调用情况同上
    	SetVariableByTemplatePtr(SetVariable, "Score: ", 109.98);	// 函数形参类型不固定  模板指针,109.98不会截断。
    
    
    	return 0;
    }
    

      

  • 相关阅读:
    etcd客户端c#
    【Python 2 到 3 系列】 关于除法的余数
    彻底搞定C指针--“函数名与函数指针”
    关于 函数指针和函数名 例子的疑难解答
    stat.h头文件,轻松获取文件属性
    C++指针之间的赋值与转换规则总结
    (转)mblog解读(二)
    (转)mblog解读(一)
    (转)renren-fast解读(二)
    (转)renren-fast解读(一)
  • 原文地址:https://www.cnblogs.com/alexYuin/p/9758237.html
Copyright © 2011-2022 走看看