Unix/C++--using详解

1 介绍

using 的别名语法覆盖了 typedef 的全部功能。

2 用法

2.1 申明

using申明 : using + 限定名称

using std::cout;

2.2 命名空间

using namespace std;

2.3 类型别名

using 类型别名=原类型

// 重定义unsigned int
typedef unsigned int uint_t;
using uint_t = unsigned int;
// 重定义std::map
typedef std::map<std::string, int> map_int_t;
using map_int_t = std::map<std::string, int>;

2.4 改变从基类继承来的成员的访问级别

class base {
public:
    int fun(int x);
    int b;
};

class son : private base {
public:
    using base::fun;    //fun(int x)由private变成public(注意:using不指定参数列表)
protected:
    using base::b;    //b由public变成protected
};

2.5 函数指针别名

typedef void (*func_t)(int, int);
using func_t = void (*)(int, int);

使用using别名,函数指针,typdef来实现函数的调用
虽然是寥寥的几行代码,但是功能在实际应用中,却会发挥很大的作用。

//using别名使用用法
#include<iostream>
#include<windows.h>
int calc() {
  //当为无参数时,返回0值
    return 0;
}

template <typename R1 ,typename...Args>
int calc(R1 a, Args...args) {

    return a + calc(args...);
}

int main(int argc , char * args []) {

    //使用函数指针
    int(*fun) (int ,int ,int ,int ) = calc;
    system("echo 使用函数指针实现1~4累加");
    std::cout << fun(1,2,3,4)<<std::endl;
   //使用typedef来实现该功能
    system("echo 使用typedef实现1~4累加");
     typedef int(*Add)(int, int, int);
     Add  Gadd = calc;
     std::cout << Gadd(1, 2, 3) << std::endl;
    //使用using别名来实现这么个功能
    system("echo 使用using实现1~4累加");
    using Func = int(*) (int, int, int, int);
    Func func = calc;
    std::cout << func(1, 2, 3, 4) << std::endl;
    std::cin.get();
	return 0;
}

2.5 模板别名

2.5.1 容器模板

using用来定义别名,特别适用于在模板的情况下
下面的例子来源于ART中的容器类型的定义

template <typename T>
using ArenaDeque = std::deque<T, ArenaAllocatorAdapter<T>>;

template <typename T>
using ArenaQueue = std::queue<T, ArenaDeque<T>>;

template <typename T>
using ArenaVector = std::vector<T, ArenaAllocatorAdapter<T>>;

template <typename T, typename Comparator = std::less<T>>
using ArenaSet = std::set<T, Comparator, ArenaAllocatorAdapter<T>>;

template <typename K, typename V, typename Comparator = std::less<K>>
using ArenaSafeMap =
    SafeMap<K, V, Comparator, ArenaAllocatorAdapter<std::pair<**const** K, V>>>;

我们需要的其实是一个固定以 std::string 为 key 的 map,它可以映射到 int 或另一个 std::string。然而这个简单的需求仅通过 typedef 却很难办到。
因此,在 C++98/03 中往往不得不这样写:

template <typename Val>
struct str_map
{
    typedef std::map<std::string, Val> type;
};
// ...
str_map<int>::type map1;
// ...

一个虽然简单但却略显烦琐的 str_map 外敷类是必要的。这明显让我们在复用某些泛型代码时非常难受。
现在,在 C++11 中终于出现了可以重定义一个模板的语法。请看下面的示例:

template <typename Val>
using str_map_t = std::map<std::string, Val>;
// ...
str_map_t<int> map1;

2.5.2 函数指针模板

从如下示例中可以看出,通过 using 定义模板别名的语法,只是在普通类型别名语法的基础上增加 template 的参数列表。使用 using 可以轻松地创建一个新的模板别名,而不需要像 C++98/03 那样使用烦琐的外敷模板。

/* C++98/03 */
template <typename T>
struct func_t
{
    typedef void (*type)(T, T);
};
// 使用 func_t 模板
func_t<int>::type xx_1;
/* C++11 */
template <typename T>
using func_t = void (*)(T, T);
// 使用 func_t 模板
func_t<int> xx_2;

2.5.3 结构体模板

//结构体模板---使用体现:声明结构元素时 StackNode<类型> s;
template<class T>
struct StackNode
{
  struct T data;
  struct StackNode<T> *next;
};

2.5.4 类模板

//类模板---使用体现:声明类对象时 Stack<类型> s;
//注:在模板定义语法中关键字class与typename的作用完全一样,即T前class 和 typename一样,防混淆,使用typedef更好
template<class T>
class Stack
{
 public:
  T pop();
  bool push(T e);
 private:
  StackNode<T> *p;
}
template<class T>//类模板外的 成员函数实现
T Stack<T>::pop()
{...}

3

参考

1、C++ template的一些高级用法(元编码,可变参数,仿函数,using使用方法,. C++ 智能指针
2、C/C++|using的简单总结
3、using五大用法
4、C++using声明和using指示
5、C++ using
6、C++11快餐教程(1)-通过using定义类型的别名
7、C++11使用using定义别名(替代typedef)

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读