C++:模板类使用成员函数模板处理隐式(implicit)转换

指针支持隐式转换(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

作者:csdn博客 Spike_King

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索指针
, 实例
, 函数
, 模板函数
, 模板
, template
, 类模板
, 函数模板
, 模板类
, 函数转换
, 模板c++实例化求助
, implicit
, 成员
隐式绑定
c站、c语言、cf、ch、c罗,以便于您获取更多的相关知识。

时间: 2024-08-24 16:27:20

C++:模板类使用成员函数模板处理隐式(implicit)转换的相关文章

class-关于类的成员函数问题

问题描述 关于类的成员函数问题 Person::Person(const std::string&ln, const char*fn = "Heyyou") 这是在类申明中的一个成员函数声明,为什么在在定义这个函数的时候会重定义?该怎么解决? 解决方案 重定义要么是同样的函数重载参数形式的函数定义了好几个,要么虽然你没有这么做,但是你重复用include包含了定义函数的源代码. 解决方案二: 类的成员函数类模板成员函数的调用问题c++ 类中的成员函数在内存空间的分配问题

使非MFC窗口程序的窗口回调过程成为C++类的成员函数

一直以来,编写非MFC下的窗口程序,都习惯把窗口过程及消息处理函数编写成全局函数.为了把窗口回调过程及窗口消息处理函数封装成C++窗口类的成员函数,于是我编写了抽象类CWndProc: 一.头文件 //wndpro.h #ifndef __WNDPROC_H__ #define __WNDPROC_H__ class CWndProc { protected: //保护的构造函数,必须由派生类来构造. CWndProc(); virtual ~CWndProc(); protected: //窗

python中如何对类的成员函数开启线程?

问题描述 python中如何对类的成员函数开启线程? 单独对某个函数开启线程是可以的,比如下面的代码: import threading import thread import time def doWaiting(): print 'start waiting:', time.strftime('%H:%M:%S') time.sleep(3) print 'stop waiting', time.strftime('%H:%M:%S') thread1 = threading.Thread

深入类的成员函数指针

先看这样一段代码   class test { public:      test(int i){ m_i=i;}      test(){};      void hello()     {          printf("hello/n");     } private:     int m_i; }; int main() {  test *p=new test();  p->hello();  p=NULL;  p->hello(); }   结果是: hello

写了个c++类的成员函数,返回引用

问题描述 写了个c++类的成员函数,返回引用 test & test::count_price(const test &a){ price+=a.price; return *this; } 原本想写成这样: test &c=a.count_price(b);//获取a的引用 结果意外写成: test c=a.count_price(b); 编译也能通过,问题就来了,为什么这样做可以呢?引用的实质是什么呢? 解决方案 你不理解的是因为:引用返回后调用拷贝构造函数生成了对象c 另一个

一般函数指针和类的成员函数指针深入解析_C 语言

函数指针是通过指向函数的指针间接调用函数.函数指针可以实现对参数类型.参数顺序.返回值都相同的函数进行封装,是多态的一种实现方式.由于类的非静态成员函数中有一个隐形的this指针,因此,类的成员函数的指针和一般函数的指针的表现形式不一样. 1.指向一般函数的指针函数指针的声明中就包括了函数的参数类型.顺序和返回值,只能把相匹配的函数地址赋值给函数指针.为了封装同类型的函数,可以把函数指针作为通用接口函数的参数,并通过函数指针来间接调用所封装的函数.下面是一个指向函数的指针使用的例子. 复制代码

c++-C++的类的成员函数问题为什么re()不能进行初始化?而setpoint()函数可以?

问题描述 C++的类的成员函数问题为什么re()不能进行初始化?而setpoint()函数可以? 如题,我知道第一个rectangle是构造函数,所以要与类同名,然后可以初始化赋值,为什么另一个程序setpoint明明不是构造函数,但是可以做赋值处理,然后程序不会报错呢?我把rectangle类里的rectangle函数改成re却是会报错,不用说void re,我试过了,还是会报错.第四张图我直接把构造函数删除掉了,程序正常运行,但是我不懂为什么re不管怎么改都会报错,请各位大神为我解答.谢谢

类的成员函数指针的使用方法

函数指针主要的目的是实现与运用相互分离,类的成员函数封装在类里面,运行需要相应的对象来调用,所以在调用这个类的成员函数时候,需要类的函数地址和这个类的对象.     以下是实现的类:     class A    {    public:void DoSth(){printf("A-DoSth");}    };    以下是调用的类:     typedef void (A::*PFun)(void);//声明类的函数指针     class B    {    public:   

怎么实现类的成员函数作为回调函数_C 语言

如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过.其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即"this"指针,C++通过传递this指针给其成员函数从而实现程序函数可以访问C++的数据成员.这也可以理解为什么C++类的多个实例可以共享成员函数却-有不同的数据成员.由于this指针的作用,使得将一个CALL-BACK型的成员函数作为回调函数安装时就会因为隐含的this指针使得函数参数个数不匹配,从而导致回调函数安装失败.要解决这一问题的关键就