C++ template Day Day Up 第二天 模板参数推论(deduction)

西门子STEP7 V5.5安装调试指南:环境配置、授权激活与报错排查 在工业自动化领域,西门子PLC编程软件是设备维护与项目开发的核心工具。STEP7 V5.5作为经典S7-300/S7-400系列的控制程序组态环境,凭借其轻量高效、兼容老项目的特点,至今仍在产线维护和教学中广泛应用。软件安装看似简单,但系统环境不匹配、授权管理器异常、PG/PC接口配置错误等细节,常导致装完无法连接或程序不兼容。本文从操作系统兼容性、环境清理、组件选择入手,详细拆解STEP7 V5.5的完整安装流程,并针对“未找到有效许可密钥”、安装报错1642/1603等高频问题给出排查思路。最后结合PL 阅读详情
Today’s subject is Compile Argument Deduction.
 
我们平时用template的时候往往需要指定template argument type,实际上很多种情况可以不指定具体的类型,而依赖于编译器的deduction(个人推荐把这个单词翻译成推论,能表达出实际的行为,侯捷翻译这个单词为演绎,可能台湾这么说,总觉得怪怪的)。
先举一个小例子(refer to C++ Templates Chapter 2):
 
 
template <typename T> 
T 
const& Max (T const& a, T const& b)
{
  
return a > b? a : b;
}

看下面的调用:
[a] Max(1, 2);
[b] Max(‘c’, ‘d’);
[c] Max(5.5, 7);
[d] Max(5.5, static_cast<double>(7) );
[e] Max<double>(5.5, 7);
 
让我们先关注[a]、[b]、[c]
调用Max模板函数的时候并没有指定模板参数!这个就是编译器为我们所作的Argument Deduction。
编译器会根据传进去的变量推断出它的类型,[a]中compiler会生成Max<int>版本的函数,[b]则会生成Max<char>版本的函数。
那么[c]呢?
答案是compiler会报告一个错误,
VS2005中文版下:error C2782: “T Max(const T &,const T &)”: 模板参数“T”不明确
G++ :error: no matching function for call to `Max(double, int)'
请注意,Max函数的定义要求a和b是同一类型,也就是说compiler对于[c]推断不出匹配的函数。解决这个问题我们可以采用[d]或者[e]的方式调用Max函数。
 
另外,编译器对于类的成员函数也可以进行Deduction,看下面的例子:
class Any
{
public:
 
     template<typename T>
     Any(T const& ty)
     {
     }
};
 
这个Any类提供一个带模板的构造函数,编译器可以为这种成员函数进行类型推论,这会给这个类一种特别的威力。
int i = 5;
string s;
stack<string> st;
vector<int> v;
Any a = i;
Any b = s;
Any c = st;
Any d = v;
上面的代码竟然能够编译!
这会为C++带来什么,Any类是void*么?不是,Any类更像是java中的Object,它比void*强在它可以存储具体类型,当向下转换的时候,也更安全。
 
上面的说明可能您不太相信,建议看一下boost库的any的实现。文章的最后给出了我参考boost写的简略版的any的实现,代码忽略了很多细节,只突出重要思想(Boost是any,这里是Any),有兴趣可以看一下。
 
注意!只有函数或者成员函数才能够进行argument deduction。
 
Argument deduction还会为我们带来什么?
我比较欣赏的是编译期多态,Design Pattern的template版本会很有意思,以后的文章会介绍到。
Summary
写着写着就觉得稍微写深了,本来只想写函数模板,真是水平不济啊!
本人希望读这系列文章的读者能够熟悉C++非模板的语法和应用,并且最好能够熟悉面向对象(之后的文章可能会涉及一些Design Pattern),能写出真正的面向对象程序。
并且希望写作水平有所提高,可以在模板基础知识之间,穿插一些实际的应用,希望每一篇blog都会给不太了解模板的程序员一点帮助。
 
附录:
缩略版Any的实现
 
class Any
{
public:
    
class PlaceHolder
    
{
    
public:
        
virtual const std::type_info & type() const = 0;
    }
;

    template
<typename Ty>
    
class Holder
        :
public PlaceHolder
    
{
    
public:
        Holder(Ty 
const& data)
            :_data(data)
        
{
        }
;

        
virtual const std::type_info & type() const
        
{
            
return typeid(_data);
        }


    
public:
        Ty _data;
    }
;

public:

    Any()
        :_holder(
0)
    
{
    }


    template
<typename T>
    Any(T 
const& ty)
        :_holder(
new Holder<T>(ty))
    
{
        cout
<<"Con:"<<typeid(ty).name()<<endl;
    }


    template
<typename T>
    Any
& operator=(const T& rh)
    
{
        
if (!_holder)
        
{
            delete _holder;
        }


        cout
<<"Op=:"<<typeid(rh).name()<<endl;

        _holder 
= new Holder<T>(rh);
        
return *this;
    }


    
const std::type_info & type() const
    
{
        
return _holder ? _holder->type() : typeid(void);
    }


    
~Any()
    
{
        delete _holder;
    }


private:

    template
<typename ResultType>
    friend    ResultType
* Any_cast(Any* operand);

    PlaceHolder
* _holder;
}
;

template
<typename ResultType>
ResultType
* Any_cast(Any* operand)
{
    
return operand && (operand->type() == typeid(ResultType))
        
? &static_cast<Any::Holder<ResultType> *>(operand->_holder)->_data : 0;
}


main函数中:
    vector
<int> vo;
    vo.push_back(
1);
    vo.push_back(
2);
    Any a 
= 5;
    a 
= vo;

    vector
<int>* v = Any_cast<vector<int> >(&a);
    
for (vector<int>::iterator it = (*v).begin(); it != (*v).end(); ++it)
    
{
        cout
<<*it<<endl;
    }

 
 
c++参数包的实现 在开发过程中,在写一些回调函数的过程中,常常希望参数是不确定、可变的,这个时候我就希望能有一个参数包,各种参数都可以塞到参数包里面,然后将该参数包作为一个参数。之前一直使用tuple或结构体指针来实现该功能,但这两者在使用过程中还是有些不方便,于是就想自己写一个参数包的类。在boost库中有一个any类型,可作为参数包中参数的载体,可自行从boost中摘抄过来。我这边也提供一份代码:#ifndef... 阅读详情

相关推荐

C++学习(八十三)std的typeid 、type_info

vcruntiem_typeinfo.h class type_info { public: type_info(type_info const&) = delete; type_info& operator=(type_info const&) = delete; size_t hash_code() const throw() { return __std_type_info_hash(&_Data); } .

hankern的专栏 2452

Python的函数介绍

函数 概念: 在一个完整的项目中,某些功能可能会反复地使用,这时我们会将这些功能封装为函数,然后当我们使用的时候直接调用函数就行。 本质: 对功能的封装就是函数。 优点: 1.简化代码结构,增加了代码的重复使用的程度 2.修改、维护、调试方便 一、创建和调用函数 用法: ''' def(关键字) 函数名(): 函数体 return 返回表达式 函数名() #调用 ''' #函数名可以大小写字母...

weixin_45717984的博客 1196

FLUKA软件在Ubuntu的安装指南(亲测有效)

FLUKA其强大的蒙特卡洛模拟能力使得用户能够模拟复杂的辐射相互作用过程

chencheng1127的博客 2887

opencv4.9版本报错

解决办法更换4.6版。

蜗牛牛的博客 2070

Matlab Arduino 硬件支持包安装 MATLAB_Support_Package_for_Arduino_Hardware

Matlab Arduino硬件支持包离线安装

weixin_43283734的博客 2841

Windows打印体系结构之Windows内置打印驱动程序

时间是一种很残酷的东西,它只会冲淡能够冲淡的,但也会洗尽铅华帮你留下该留下的。1.3.4、Windows内置打印驱动程序现在的Windows下的打印机驱动程序通常分为V4打印机驱动程序(V4 Printer Driver)、XPS打印机驱动程序(XPSDrv)、微软通用打印机驱动程序(Microsoft UniversalPrinter Driver)、微软PostScri...

weixin_34309435的博客 2254

接上一主题,C++14中如何设计类似于std::any,使集合在C++中与Python一样支持任意数据?

C++: 上面一行代码中,有 char Array[], int, wchar_t Array[], 链表, Dobule 下面我们设计一个类 _any,它在构造函数如果是这样,上面语句就能编译过关。 上面最难的地方是在类_any内部中如何保存 tValue的值,如果把类声明为模板类,很容易解决,但是就要在每_any指定模板参数T,这样行不能? 用: std::shared_ptr吗? auto s = std::make_shared(tValue); 也不行,变量声

weixin_42944928的博客 574

基于OpenSSL的CA建立及证书签发(签发多域名/IP)

自签SSL证书(多域名/IP) 本文基于以下环境: 内核信息:Linux zabbix 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux 系统版本:CentOS Linux release 7.6.1810 (Core) OpenSSL版本:OpenSSL 1.0.2k-fips 26 Jan 2017 【前言】 在基于OpenSSL的CA建立及证书签发一文中(后面统.

hobby云说 4647

任意类型容器Any

利用模板类继承非模板类,实现一个可以存储任意类型的容器 #ifndef _ANY_H #define _ANY_H #include <string> #include <algorithm> class IAnyItem abstract { public: virtual ~IAnyItem() {} virtual const type_info& ...

虹少侠的博客 763

Linux | Ubuntu18.04安装RTX 4060显卡驱动完整教程

本节详细介绍了如何在ubuntu18系统安装4060显卡的驱动。

九七的博客 5160

KEPServerEX 6 之 lot Gateway MQTT Clinet 配置使用方式

IoT Gateway即Internet of Things Gateway物联网网关。 ---------------------------------------------------------------------------------- 方式:使用kepw的IOTGateway插件选择MQTTClient 解决:可以实现 KEPW 的Tag值 发送到 MQTT 服务器上 ----------------------------------------...

-雲飛兄-博客 6942

c++实现反射功能

这是一个无入侵的,并且带有反射代码生成工具的开源库。程序员一般都很懒,能自动实现的一般不想逐行敲代码,我们需要一个自动生成反射代码的工具,在这个开源库中,提供了一种基于llvm+clang进行代码生成的工具,在我们程序代码中只需要把需要反射的成员、函数打上下面的标记,利用反射工具就可以自动生成代码。反射工具会分析头文件,由于反射工具的REF_EXPORT_FLAG宏是生效的, 因此它看到标记了需要反射的成员前面都会多出了一个特殊的struct,基于此就可以把需要反射的信息提取出来,并生成我们需要的代码。

itnkcong的博客 2850

eDP V1.4协议介绍

eDP的全称是Embedded DisplayPort嵌入式显示端口,主要应用与短距离系统内应用,例如手机、一体式台式机等。eDP V1.4b是基于DP V1.3标准制作完成,但因应用场景的不同,还是有很多区别。电压摆幅不同,eDP相对较低;eDP功耗相对较低;DP有线材和连接器的要求,eDP没有明确要求;AUX通道电路设计不同(相对DP取消了AC耦合电容和100KΩ/1MΩ的上下拉电阻):典型应用场景;

qflook的博客 4303

RTTI和CAST

什么是RTTI?

ranxirui8580的博客 169

【Arduino 动手做】构建一个迷你 Las Vegas RGB LED 球体

《Arduino迷你拉斯维加斯球体项目:15岁少年的创意挑战》 15岁的Ben通过本项目展示了如何利用Arduino平台制作一个经济实惠的迷你拉斯维加斯球体夜灯。该项目涉及LED选择(采用WS2812B可编程灯带)、电子元件配置(含Arduino Nano微控制器和红外遥控)以及3D建模设计(100毫米直径球体)。项目难点包括LED布局优化、供电方案设计和3D打印外壳制作。Ben详细记录了从背景研究、电路设计到最终实现的完整过程,特别强调了分辨率与成本的平衡,以及如何通过白色扩散器改善视觉效果。这个项目不仅

雕爷学编程 1024

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【项目三】C++实现事件委托

前几天在学习设计模式中的观察者模式时发现需要用到一个十分巧妙的机制——事件委托,事件委托的匿名属性,可以使得通知者对象更新观察者对象时不需要依赖具体名称的函数,是一种降低系统耦合度的设计。我看的设计模式书是《大话设计模式》,里面使用C#举例的,C#中就有事件委托的机制,而我是学C++,无奈C++中没有事件委托的设计,虽然Qt中有类似的机制——信号与槽,但是总感觉技术不如掌握在自己手中好,索性自己了解并编写一套事件委托系统

学艺不精的Anton的博客 1409

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C++实现委托机制(二)

上一篇文章已经介绍了如何构建一个无参数无返回值的函数指针的委托,这篇文章将对上一文章所述委托进行扩展,使得可以注册任意函数指针,不过再讲篇内容之前先要介绍一下实现这个功能所需要了解的C++11的一个新特性———可变参数模板。

YzlCoder的记事本 8182

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

现代C++之理解模板类型推断(template type deduction)

现代C++之理解模板类型推断(template type deduction) 理解模板类型推断(template type deduction) 我们往往不能理解一个复杂的系统是如何运作的,但是却知道这个系统能够做什么。C++的模板类型推断便是如此,把参数传递到模板函数往往能让程序员得到满意的结果,但是却不能够比较清晰的描述其中的推断过程。模板类型推断是现代C++中被广泛使用的关键字auto...

HarlanC的专栏 956

C++ 九阴真经之任意值

any是一个可用于任何类型单个值的类型安全的容器,目前已收录到C++17标准库,但对于一些历史 项目,可能并没有使用最新编译器,那么可以自己简单的实现。 代码实现: #include <assert.h> #include <typeinfo> #include <string> class AnyVar { public: //保存真正数据的接口类 class placeholder { public: virtual ~placeholder

零落年华的专栏 287

Template Type Deduction

C++模板类型推导 对于如下的C++模板类型推导 template<typename T> void f(ParamType param); f(expr);// 根据expr推导T和ParamType 要分三钟情况: Case 1 ParamType是引用或指针,且不是Universal Reference 首先,如果expr是引用类型,则C++模板类型推导时会忽略参数expr的reference-ness。 然后,对ParamType的推导决定对T的推导 正常情况下,expr的cons

weixin_43313321的博客 285

【C++】模板参数推导(template argument deduction)

    Table of Contents 1 模板参数推导在迭代器中的使用 2 模板参数引用与非引用的区别 1 模板参数推导在迭代器中的使用 在算法中运用迭代器时,可能会用到其相应类型(associative type),即迭代器所指向对象的类别。但C++只支持sizeof(),并不存在typeof()之说(即使运用RTTI性质中的ty...

weixin_34082854的博客 346

从零开始写STL—模板元编程之any

any class any; (since C++17) The class any describes a type-safe container for single values of any type. (1) An object of class any stores an instance of any type that satisfies the constructo...

aocan6909的博客 292

常见错误总结

1、error C2275: “XXX”: 将此类型用作表达式非法 在移植c++代码到c的时候,经常会出现一个奇怪的错误, error C2275: “XXX”: 将此类型用作表达式非法, 这个错误是由于c的编译器要求将变量的声明放在所有函数调用语句之前,而c++没有这样的要求造成的。  解决的办法就是把变量的声明全部放在变量的生存块的开始。  2、error C2780: “c

xdx2ct1314的专栏 911

strcpy用于调用的参数太少_C++ 11新特性 1. Variadic Templates 可变数量的模板参数

关键字"...":...:代表可以接受任意变化个数的东西。个数随意。每一个的类型也随意。...:就是一个所谓的pack(包)用于template parameters,就是template parameters pack(模板参数包)。用于function parameters types,就是function parameter type pack(函数参数类型包)。用于function par...

weixin_39631632的博客 938
上一篇: C++ template Day Day Up 第一天 模板编译模式
下一篇: C++ template Day Day Up 第三天 模板函数的重载
firectrl
博客等级 码龄20年 4粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值