关键字 Using
关键字 Using
[TOC]
using关键字在现代C++中非常有用,特别是在涉及模板编程和泛型编程时,它可以与别名模板结合来使代码更加清晰和容易维护。由于using让代码更加符合直觉,其在类型定义和命名空间管理方面比传统的typedef和单独的命名空间声明更受欢迎。1
1、声明命名空间
“using” 关键字最为人熟知的用途之一就是简化命名空间2的使用。
using声明可以将命名空间中的特定成员引入当前作用域,或者声明整个命名空间,使其下的所有成员都可以直接使用而不需要命名空间前缀。
1
2
3
4
// 这样可以直接使用cout而不是std::cout:
using std::cout;
// 使std命名空间中的所有名字都可用:(并不推荐这么用,因为可能导致命名冲突)
using namespace std;
2、类型别名
“using”关键字还可以用于定义类型别名,让我们的代码更易读,更具可维护性。
(1) 复杂类型
当我们需要给某个复杂或冗长的类型名称定义一个更简短、易于理解的别名时,就可以使用using来定义这个别名,此时与typedef的用法其实是一样的。
1
2
3
4
5
6
7
8
9
10
11
12
// 使用typedef定义std::vector<int>的别名:
typedef std::vector<int> vecInt;
// 使用using定义一个别名:
using vecInt = std::vector<int>;
// 使用using定义一个储存Base指针的智能指针的别名:
using ptrBase = std::unique_ptr<Base>;
// 使用该类型:
ptrBase myPtr = std::make_unique<Base>();
// 一个很长的类型名:
using fspath = std::filesystem::path;
(2) 函数指针
定义一个函数指针:
1
2
3
4
// 使用typedef定义一个函数指针:
typedef std::unique_ptr<Base> (*MyFunc)();
// 使用using定义一个函数指针:
using MyFunc = std::unique_ptr<Base>(*)();
上面分别通过typedef和using定义了一个类型别名FactoryFunction,它是一个指向函数的指针,这个函数没有参数,并返回std::unique_ptr<Base>类型的对象。
现在,FactoryFunction可以用来声明任何符合上述签名的函数指针。例如:1
std::unique_ptr<Base> CreateBaseInstance() {
return std::make_unique<Derived>(); // 假设Derived是Base的一个派生类
}
MyFunc testFunc = CreateBaseInstance;
(3) 模板别名
在模板编程中,using关键字能够为模板定义一个新的别名,使得模板的实例化更加简洁。
1
2
3
4
5
template<typename T>
using Vec = std::vector<T>;
// 使用
Vec<int> intVector;
3. 修改基类函数的访问权限
在类继承中,using声明可以用来在派生类中改变基类成员的访问权限:
1
2
3
4
5
6
7
8
9
class Base {
protected:
void function() {}
};
class Derived : public Base {
public:
using Base::function; // function在Derived中现在是public的
};
4. 继承基类的构造函数
派生类可以用using声明来直接继承基类的构造函数,而不需要自己重新定义:
1
2
3
4
class Derived : public Base {
public:
using Base::Base; // 继承Base的所有构造函数
};
参考文章345
本文由作者按照
CC BY 4.0
进行授权