C++ - 模板类模板成员函数(member function template)隐式处理(implicit)变化

模板类模板成员函数(member function template)隐式处理(implicit)变化

本文地址: http://blog.csdn.net/caroline_wendy/article/details/24233693

指针支持隐式转换(implicit conversion), 在动态绑定中,派生类指针能够转换为基类指针.

可是模板的实例化(instantiations)之间, 是单独存在的,

派生类的实例化的模板(SmartPtr<Derived>),
不能
转换为基类实例化的模板(SmartPtr<Base>);

须要明白的编写, 由于派生类也能够继续做为基类, 产生派生类, 所以无法直接写出构造函数.

使用成员函数模板(member function template), 再声明一个模板參数, 提供这样的隐式转换.

为了使用转换仅仅能发生在能够转换的指针, 如"Derived->Base", 不能逆序, 所以引入相关约束推断能否够转换.

成员初始化列表(member initialization list)中调用get()函数, 推断能否够隐式转换.

使用成员函数模板的构造函数, 是成员函数的一种, 并非重载复制构造函数, 所以类会自己主动生成一个默认构造函数.

代码注意: 第一个能够转换, 第二个不能转换, 第三个使用默认的构造函数.

代码:

/*
 * test.cpp
 *
 *  Created on: 2014.04.20
 *      Author: Spike
 */

/*eclipse cdt, gcc 4.8.1*/

#include <iostream>

using namespace std;

class Base{};

class Derived : public Base {};

template<typename T>
class SmartPtr {
public:
	SmartPtr() = default;
	template<typename U>
	SmartPtr(const SmartPtr<U>& other)
		: heldPtr(other.get()) {
		std::cout << "SmartPtr:CopyConstructor" << std::endl;
	}
	T* get() const {return heldPtr;}
private:
	T* heldPtr;
};

int main() {

	SmartPtr<Derived> spd;
	SmartPtr<Base> spb(spd);

	//SmartPtr<Base> spb1;
	//SmartPtr<Derived> spd1(spb1); //无法进行隐身转换

	SmartPtr<Base> spd2;
	SmartPtr<Base> spd21(spd2); //使用默认的复制构造函数
	return 0;
}

输出:

SmartPtr:CopyConstructor

版权声明:本文博客原创文章。博客,未经同意,不得转载。

时间: 2024-08-09 10:24:26

C++ - 模板类模板成员函数(member function template)隐式处理(implicit)变化的相关文章

C++类的成员函数的指针和mem_fun适配器的用法

一.普通函数指针 我们先来看一个最简单的函数: void fool(int a) { cout << a<< endl; } 那么它的函数指针类型为: void (*) (int) 我们可以这样测试: void (*pFunc)(int) = &foo;//这里pFunc是个指针 pFunc(123); 这样就会打印出整数123:为了简化,我们可以使用typedef: typedef void (*pFunc)(int); 这里我们要说明一下: 这里的pFunc是 返回值为

类的成员函数指针和mem_fun适配器的用法

先来看一个最简单的函数: void foo(int a) { cout << a << endl; } 它的函数指针类型为 void (*)(int); 我们可以这样使用: void (*pFunc)(int) = &foo; pFunc(123); 这就是函数指针的基本使用.   类的成员函数   那么,对于类的成员函数,函数指针有什么不同呢? 我们观察下面的类: class Foo { public: //void (Foo::*)(int) void foo(int

C++——类的成员函数指针以及mem_fun适配器

有这样一个类,我们以此类为基础: 1 class Foo 2 { 3 public: 4 5 //void (Foo::*)(int) 6 void foo(int a) 7 { 8 cout << a << endl; 9 } 10 11 //void (*)(int) 12 static void bar(int a) 13 { 14 cout << a << endl; 15 } 16 }; 我们尝试调用函数指针: void (*pFunc)(int)

C++提高1 【泛型编程】函数模板 类模板

[本文谢绝转载] [泛型编程] 函数模板 为什么会有函数模板 现象: 函数的业务逻辑一样 函数的参数类型不一样 [最常用]函数模板  显式的调用 [不常用]类型推导 多个参数,参数定义了必须要用 函数模板,实现int类型数组,char字符串排序: 函数模板 与 普通函数的本质区别 函数模板 和 普通函数在一起 的调用型研究: C++是如何支持函数模板机制的? 函数模板机制结论 类模板 类模板的定义 类模板做函数的参数 类模板的派生成普通类 模板类的派生成模板类 复数类,所有函数都写在类的内部,运

函数模板 类模板

摘要:学习函数模板的定义,使用:学习类模板的定义和使用. 函数模板: template <typename 类型参数> 返回类型 函数名(模板形参表) { 函数体 } 特点:1.函数模板可以重载(比如形参数量不同的情况). 2.定义的时候,template <typename 类型参数>到下面一个语句之间不允许插入其他语句! 3.如果程序中有和函数模板名称相同的非函数模板函数,则优先调用它. 例子: #include<iostream> using namespace

模板类的友元函数

非模板友元函数 模板类的非模板友元函数是说该模板类的友元函数只是一个普通函数,并且该函数是非模板函数或该函数不视为模板函数.这里包含了两种情况,下面分别就两个例子进行说明. • 函数是非模板函数 这一类友元函数特点是不带有参数列表,例如:friend void Fn().这类友元函数通常可以用于全局对象的访问. #include <iostream> using namespace std; template <class T> class MyNumber { private:

在c++ 模板类外写 操作符重载函数,并且是模板类的友元函数

看视频教程说不能在c++ 模板类外写 操作符重载函数,并且是模板类的友元函数 我试了试,可以,放出测试代码: #include <iostream> using namespace std; template<typename T> class A { public: A(T a) { this->a = a; } template<typename T> //加上这句就可以了 friend A<T> operator+(A<T> &

类的成员函数指针(比較深入)

From:http://blog.csdn.net/hairetz/archive/2009/05/06/4153252.aspx 个人感觉对于类的成员函数指针这块解说的比較深入具体 推荐阅读 ///////////////////////////////////////////////// 先看这样一段代码 class test {    public:       test(int i){ m_i=i;}       test(){} void hello()       {        

C++ 11 线程调用类的成员函数解决办法

在C++中,_beginthreadex 创建线程是很麻烦的.要求入口函数必须是类的静态函数. 通常,可以采用thunk,或者模板来实现. 因C++ 11中引入了 std::async ,可以很好的解决这个问题了. 值得注意的是,在循环中 std::async 创建线程,我试了好多次总是失败,后来看老外的代码,采用 std::move解决了问题. 具体见实现代码. // ConsoleApplication1.cpp : 定义控制台应用程序的入口点. #include "stdafx.h&quo