本文用於隨手記錄一些自己學習中碰到的c++特性。
對於以下std::tuple
在未有該特性前,對其解包很麻煩,使用std;:get要寫一大串std::tuple<
int, std::string,
double
> foo
;
或者定義一堆變數再呼叫std::tie方法std::cout << std::get<
0>
(foo)
<< std::get<
1>
(foo)
<< std::get<
2>
(foo)
;//print 1 foo 3.14
現在只需要使用結構化繫結,十分優雅int a;
std::string b;
double c;
std::
tie(a, b, c)
= foo;
std::cout << a << b << c;
//print 1 foo 3.14
在chrono庫中有個用於sleep的函式,它長這樣auto
&&[a, b, c]
= foo;
std::cout << a << b << c;
//print 1 foo 3.14
上面的那個1s是個啥?開啟chrono庫找到了這個1s的實現using
namespace std::chrono_literals;
std::this_thread::
sleep_for
(1s)
;
重點就在這個operator"" s上,其實這用到了使用者定義字面量的特性,這使得使用者可以自定義字尾。可以使用該特性來定義乙個二進位制數字尾,實現如下_nodiscard constexpr chrono::seconds operator""s
(unsigned
long
long _val)
然後我們就能這樣定義二進位制數using ll =
long
long
;ll operator""b
(const
char
* num, size_t length)
;return
decimal_2_binary
(num,
0, length -1,
0);}
使用可變引數模板,在c++17之前展開比較繁瑣。例如,實現乙個不定引數的求和函式可能需要這麼寫auto
&& a =
"110"b;
auto
&& b =
"111101"b;
std::cout << a << b;
//print 6 61
在c++17有了摺疊表示式之後,配合c++14的泛型lambda使用,可以簡化成這樣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
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...