C 特性自用學習筆記

2021-10-07 10:28:28 字數 2104 閱讀 8256

本文用於隨手記錄一些自己學習中碰到的c++特性。

對於以下std::tuple

std::tuple<

int, std::string,

double

> foo

;

在未有該特性前,對其解包很麻煩,使用std;:get要寫一大串

std::cout << std::get<

0>

(foo)

<< std::get<

1>

(foo)

<< std::get<

2>

(foo)

;//print 1 foo 3.14

或者定義一堆變數再呼叫std::tie方法

int a;

std::string b;

double c;

std::

tie(a, b, c)

= foo;

std::cout << a << b << c;

//print 1 foo 3.14

現在只需要使用結構化繫結,十分優雅

auto

&&[a, b, c]

= foo;

std::cout << a << b << c;

//print 1 foo 3.14

在chrono庫中有個用於sleep的函式,它長這樣

using

namespace std::chrono_literals;

std::this_thread::

sleep_for

(1s)

;

上面的那個1s是個啥?開啟chrono庫找到了這個1s的實現

_nodiscard constexpr chrono::seconds operator""s

(unsigned

long

long _val)

重點就在這個operator"" s上,其實這用到了使用者定義字面量的特性,這使得使用者可以自定義字尾。可以使用該特性來定義乙個二進位制數字尾,實現如下

using ll =

long

long

;ll operator""b

(const

char

* num, size_t length)

;return

decimal_2_binary

(num,

0, length -1,

0);}

然後我們就能這樣定義二進位制數

auto

&& a =

"110"b;

auto

&& b =

"111101"b;

std::cout << a << b;

//print 6 61

使用可變引數模板,在c++17之前展開比較繁瑣。例如,實現乙個不定引數的求和函式可能需要這麼寫

template

<

typename t>

t sum

(t&& arg)

template

<

typename t,

typename..

.args>

auto

sum(t&& a, args&&..

. rest)

std::cout <<

sum(1,

2,3,

4,5)

;//print 15

在c++17有了摺疊表示式之後,配合c++14的泛型lambda使用,可以簡化成這樣

auto

&& sum =

(auto&&.

.. args)

;std::cout <<

sum(1,

2,3,

4,5)

;//print 15

C 特性學習筆記

本筆記摘抄自 記錄一下學習過程以備後續查用。特性提供功能強大的方法,用以將元資料或宣告資訊與 程式集 型別 方法 屬性等 相關聯。特性與程式實體關聯後,即可在執行時使用名為 反射 的技術查詢特性。特性,如serializable,它其實就是乙個類,定義方式跟類一樣,且所有特性都是直接或間接繼承自at...

shiro學習筆記(自用)

1.獲取當前的 subject.呼叫 securityutils.getsubject 2.測試當前的使用者是否已經被認證.即是否已經登入.呼叫 subject 的 isauthenticated 3.若沒有被認證,則把使用者名稱和密碼封裝為 usernamepasswordtoken 物件 1 建...

c 學習筆記 附新特性

這裡有一些是新特性,有一些是為了描述新特性另外說明的一些東西。參考 入口 這篇文章對三種繼承方式講的很明白,感覺自己多說乙個字都不對勁。成員預設是private,繼承預設也是private。參考 入口 基類中的virtual 0,為純虛函式,否則為虛函式。class person class stu...