你可能会感兴趣的 5 个隐藏的 C++ 语言特性

简介: 原文来自:http://news.html5tricks.com/5-hidden-cpp-features.html一天又一天,C++ 是越来越火起来了.


原文来自:http://news.html5tricks.com/5-hidden-cpp-features.html

一天又一天,C++ 是越来越火起来了. 作为一种范式覆盖语言,C++的这些隐藏特性基本上就基本上只是对其现有的基础设施的灵活使用. 其实还有更多的这样的设施,而我们也乐于听见读者对此能够有所补充.

#1. 众所周知的三元运算符 (?:), 许多人并没有意识到它可以作为左值来使用.

x = (y < 0) ? 10 : 20;
(a == 0 ? a : b) = 1;

不这样的话,你就只能得像下面这样写了,

if (a == 0)
a = 1;
else
b = 1;

#2.  命名空间别名这一特性你也可能会很容易的错过. 一旦你了解了它,你就会认识到它是无所不在的. 当你在在编写一端带有许多命名空间层级结构的大型代码时,它是特别的有用啊.  

namespace x = boost::filesystem;

x::path myPath(strPath, fs::native );

#3.  变量并不是唯一能够在函数的初始部分被声明的东西. 你也可以声明类和其它的函数. 

for(struct { int x; float y; } loop = { 1, 2 }; …; …) {

}

#4.    一元的 + 运算符可以被用来增进或者消退某些东西的量. 见下面的一些示例. 

+EnumeratorValue: 这能给予你的枚举值一个完美的整形, 其能让枚举值适合它的值. 这在实现针对枚举的操作符重载时相当的有用.

向变量传递一个临时的值: 你可以为使用这个操作符的变量创建一个临时的值. 例如,如果你有一个使用了一个没有任何外部的类定义的内部的类静态初始化器的类,但有时系统会链接失败,这样的类的话.

struct Foo {
static int const value = 42;
};

template
void f(T const&);

int main() {
// fails to link and tries to get the address of “Foo::value”!
f(Foo::value);

// works – pass a temporary value
f(+Foo::value);
}

递减一个数组的指针: 操作符也能在你想要传递两个值到一个函数中时起作用.

template
void f(T const& a, T const& b);

int main() {
int a[2];
int b[3];
f(a, b); // won’t work! different values for “T”!
f(+a, +b); // works! T is “int*” both time
}

#5 . 你必须知道有 id/标识 的元函数。现在就看看这个针对他的用例吧,其适用于没有模板的情况. 

// void (*f)(); // same
id::type *f;

// void (*f(void(*p)()))(int); // same
id::type *f(id::type *p);

// int (*p)[2] = new int[10][2]; // same
id::type *p = new int[10][2];

// void (C::*p)(int) = 0; // same
id::type C::*p = 0;

It helps decrypting C++ declarations greatly!

//几乎跟 boost::identity 是一样的
template
struct id { typedef T type; };

目录
相关文章
|
1月前
|
编译器 程序员 定位技术
C++ 20新特性之Concepts
在C++ 20之前,我们在编写泛型代码时,模板参数的约束往往通过复杂的SFINAE(Substitution Failure Is Not An Error)策略或繁琐的Traits类来实现。这不仅难以阅读,也非常容易出错,导致很多程序员在提及泛型编程时,总是心有余悸、脊背发凉。 在没有引入Concepts之前,我们只能依靠经验和技巧来解读编译器给出的错误信息,很容易陷入“类型迷路”。这就好比在没有GPS导航的年代,我们依靠复杂的地图和模糊的方向指示去一个陌生的地点,很容易迷路。而Concepts的引入,就像是给C++的模板系统安装了一个GPS导航仪
103 59
|
1月前
|
算法 C++
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
34 5
|
1月前
|
存储 编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(三)
【C++】面向对象编程的三大特性:深入解析多态机制
|
1月前
|
存储 编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(二)
【C++】面向对象编程的三大特性:深入解析多态机制
|
1月前
|
编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(一)
【C++】面向对象编程的三大特性:深入解析多态机制
|
1月前
|
存储 安全 编译器
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(一)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
26天前
|
C++
C++ 20新特性之结构化绑定
在C++ 20出现之前,当我们需要访问一个结构体或类的多个成员时,通常使用.或->操作符。对于复杂的数据结构,这种访问方式往往会显得冗长,也难以理解。C++ 20中引入的结构化绑定允许我们直接从一个聚合类型(比如:tuple、struct、class等)中提取出多个成员,并为它们分别命名。这一特性大大简化了对复杂数据结构的访问方式,使代码更加清晰、易读。
32 0
|
2月前
|
编译器 C++ 容器
C++ 11新特性之语法甜点2
C++ 11新特性之语法甜点2
30 1
|
1月前
|
存储 编译器 C语言
深入计算机语言之C++:类与对象(上)
深入计算机语言之C++:类与对象(上)
|
1月前
|
存储 分布式计算 编译器
深入计算机语言之C++:C到C++的过度-2
深入计算机语言之C++:C到C++的过度-2