【无标题】

decltype关键字

  • 如果条件都不满足,则var的类型与expression的类型相同。
  • 如果expression是左值(能取地址)、或者用括号括起来的标识符,那么var的类型是expression的引用。
  • 如果expression是函数调用,则var的类型与函数的返回值类型相同(函数不能返回void,但可以返回void*)
  • 如果expression是没有用括号括起来的标识符,则var的类型与该标识符的类型相同,包括const等限定符。 Git更改
  • decltype(expression) var;
    decltype 不会执行函数之会得到他类型
#include <iostream>
int func(){
    std::cout << "调用了函数" << std::endl;
    return 3;

}

int main() {
//如果expression是没有用括号括起来的标识符,则var的类型与该标识符的类型相同,包括const等限定符。
//如果expression是函数调用,则var的类型与函数的返回值类型相同(函数不能返回void,但可以返回void*)
//如果expression是左值(能取地址)、或者用括号括起来的标识符,那么var的类型是expression的引用。
//如果上面的条件都不满足,则var的类型与expression的类型相同。
short a = 5;
short b = 10;
short& ra = a;
    //这是函数类型
    //decltype(func) *da = func;
    //这是函数引用也可以调用函数
    decltype((func)) da=func;
    da();
}
#include <iostream>

template <typename T, typename T1> 
//-> decltype(x+y) 后边在作用域内 前边在不作用域内
auto func(T x , T1 y)-> decltype(x+y)
{
    decltype(x+y) tmp = x+y;
    std::cout << tmp << std::endl;
    return tmp;
}

int main() {

    func(1,2);

    return 0;
}
#include <iostream>
//类模板
//也可制定类型如果没有类型默认int
template <class T1, class T2=int >
class Person
{
public:
    T1 m_A; //类模板中成员变量可以不加const
    T2 m_B; //类模板中成员变量可以不加const
    Person()= default;
    //构造函数
    Person(T1 a, T2 b) : m_A(a), m_B(b) {}
    //成员函数的返回类型定义
    T1 getA()
    {
        T1 a = 2; //类模板中成员函数的参数可以不加const
        return m_A + a;
    }
    T2 getB()
    {
        T2 b = 6;
        return m_B + b;
    }
};
//函数模板
int main() {
    //类模板不能自动推倒数据类型
    Person<int,double> a{}; //用类磨棒创建对象 要有默认构造函数
    a.m_B = 10,a.m_A = static_cast<int>(10.3);
    std::cout << a.getA() << std::endl;
    std::cout << a.getB() << std::endl;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值