2017年6月4日 星期日

如何在 Visual Studio 2017 使用 bits/stdc++.h

如何在 Visual Studio 2017 使用 bits/stdc++.h


gcc 有個便捷的功能,使用
#include <bits/stdc++.h>
可以一次載入全部的頭文件,你可以不用去思考缺了那些沒補上。
bits/stdc++.h 這份文件是 gcc 自己非標準檔案,VS並沒有也沒有替代方案,作法就是從gcc裡面複製出來,拷貝到VS裡面。
這裡以 Visual Studio 2017 為例,將 gcc 7.1.0 版本的檔案複製進去。
如果你的VS版本不是這個版本也可以使用,只是路徑會不一樣而已。
檔案我已經幫你準備好了,你可以從以下載點獲得:
下載:Visual Studio use stdc++

流程

複製 bits 整個資料夾到以下路徑:(快速點擊3下全選)
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\include
編譯器版本不一樣路徑會變,自己手動開進去找,大概就是2017還有14.10.25017這兩個會變吧。

2017年6月3日 星期六

隱式轉換 執行的條件 與 如何避免

隱式轉換

tags: C++ Concept2
More Effective C++ 條款5
在不同的型別之間允許執行單引數與轉型運算子的隱式轉換
編譯器會想盡辦法為你找出一個適當的的函式

什麼是引數與參數

參數指的是函式定義或宣告上的,比如說
void fun(int a){...}
這個A稱為 fun() 的第一個參數
引數指的是使用的時候比如說
int num=1;
fun(num);
這時候這裡的 num 的位置稱為第一個引數

型態不符

當引數型態與參數不符的時候
假設有一個函式的參數為 string
void funStr(string s){}
使用時輸入的引數是 char[]
char str[] = "ABC";
funStr(str);
這時候引數(char[])與參數(string)型態不符
編譯器會替你找出一個適合的建構子或轉型運算子轉換。

轉換函式

有兩個會成為轉換函式
  • 單引數建構子
  • 轉型運算子

單引數建構子

上面的例子他發現 string (const char* s); 這個很適合,而且沒有第二個選擇,編譯器會自做主張的幫你修改。
funStr(string(str));
這裡可以參考 string 的 ref 其中第4個建構子就是被選中的函式。
http://www.cplusplus.com/reference/string/string/string/
// from c-string (4)
string (const char* s);
任何一個單引數的建構子都會成為成為隱式轉換的函式
(語意上來看基本型別也可以算在這裡。如:int i(0);)
這裡指的是引數不是參數,限制比較寬一些
以下的建構子都算是單引數,都會成為隱式轉換的函式
struct A{
    A(int i){}
};

struct B{
    B(int i, int j=0){}
};
一個具有預設指定的參數並不影響單引數,因為使用的時候可以不輸入。
A a(0);
B b(0);

轉型運算子

還有另一種情況是轉型運算子,假設我們有一個自訂型別內含一個轉型運算子。
struct A {
    A() {}
    operator string();
};
這個運算子用法可以有兩種方式呼叫
A num;

// C++ 轉型
static_cast<string>(num);
// C style 轉型
(string)num;
現在有一個函式如下
void funStr(string s) {}
如果你這樣使用
funStr(str);
編譯器會為你找出轉型運算子自動套用
funStr((string)str);

如果有兩個適合的隱式轉換函式

會發生曖昧(ambiguous)衝突,編譯器無法幫你做出決定。
有兩個類別與一個函式的定義如下
struct A{
    A(class B& i){}
};
struct B{
    B(){}
    operator A(){return B();}
};
void fun(A i){}
當你這樣使用的時候
B b;
fun(b);
error: conversion from 'B' to 'A' is ambiguous
這時候有兩個候選分別是 A 的建構子與 B 的轉型運算子,適用於這裡,編譯器沒辦法幫你做出取捨。

如何避免這個問題(拒絕編譯器隱式轉換)

明確的表達

為你的單引數建構子或轉型運算子加上 explicit 關鍵字
struct A {
    A() {}
    explicit operator string();
};
如此一來除非你明顯的告訴編譯器
A a;
(string)a;
需要轉型否則編譯器將不會自作主張的幫你轉換
用在建構子上也是直接加上即可。

替身類別

用一個類別轉介也可以達到相同的效果
struct Num {
    struct proxy{
        proxy(int i): len(i){}
        operator int&(){return len;}
        int len;
    };
    Num(proxy i): num(i) {}
    int num;
};
void fun(Num n){}
阻斷編譯器的隱式轉換,如此一來你只能明確的輸入正確的型別。
fun(Num(0));
因為它們是高度相關的,而且不應該被客戶使用,應該把它放入類內並使用私有保護。

使用函式轉換型別

明確的使用函式來轉換型別,而不使用隱式轉換運算子
如 string 內的函式 c_str() 就是一個應用的實例
依據自己想轉出的型別做適當的函式,必要時可以加上 const 避免在交出成員指針之後,成員資料非適當的被修改造成錯誤。

例外

某些條件下等號可以成為拒絕隱式轉換的手段,一個自訂型別宣告時如果是帶等號的會影響轉型目標。
型別定義如下
struct Str{
    Str(string s=""){}
};
現在當你使用建構子建構時
Str s("ABC");
當前型別為 char* 目標型別為建構子的 string,編譯器會嘗試將 char* 轉成 string 而 string 正好有一個引數為 char* 的單引數建構子,於是編譯器適當的幫你轉換。
Str s(string("ABC"));
當你使用等號作為建構子時
Str s = "ABC";
這時候目標型別是 Str (左右兩邊要相等),編譯器會嘗試將 char* 轉成 Str,因為找不到適合的函式,故無法轉換。(不過這在VC上不會出問題,只出現在gcc上)
等號這裡的語意是複製語意(copy initialization),之所以最終仍然直接呼叫建構子是因為,編譯器的優化—-複製省略(copy elision),使得最終的結果與直接呼較建構子(direct initialization)相似。

參考

2017年6月1日 星期四

台灣 如何儲值、購買得到APP 專欄、電子商品、書

台灣 如何儲值、購買得到APP 專欄、電子商品、書


購買方法

台灣並不是如多數人所說的那樣不能購買,實際上至少有三個通道可以購買
  • 代購序號
  • 微信
  • Apple

其中 Apple 應該是最簡單的,如果你拿蘋果手機,可以直接購買即可。
這篇主要針對大家都可以的路線,微信支付購買得到APP專
方法有兩種:
  • 得到APP內綁定微信號直接APP內購
  • 關注得到APP公眾號從微信儲值
微信支付的話有台灣信用卡就可以開通了,可以參考這篇站內文:
台灣開通 微信支付錢包 [不用別人給紅包或跑中國、無須大陸銀行卡台胞證] 得到APP


得到APP內購

第一次要先綁定微信號,到這裡看有沒有綁定了
建議一起綁定台灣手機,微信之前有一次無故大量封過一次帳戶
運氣不好被選中就沒了(需要大陸身分證才能解鎖)
再來到你的個人頁面,右下角的我,選擇你的帳戶
跟剛剛差不多的流程
輸入密碼


關注得到

搜索得到並關注,按 放大鏡 搜索,不要按到那個 +
找到這個圓形的得到,點一下關注,接下來在你的主頁可以找到得到
進來之後點儲值
第一次要你登入,看你當初得到是用微信辦的還是手機
早期不開放海外手機,應該都是用微信,直接登入即可
選擇要儲存的額度
輸入你的支付密碼


Apple

Apple 商店似乎可以直接購買,拿蘋果手機的人比較省事XDD

2017年5月30日 星期二

[圖文] 台灣|微信支付|超商儲值|幫幫寶教程

[圖文] 台灣|微信支付|超商儲值|幫幫寶教程


官方網站:https://www.paybao.com.tw/
今年改版多次,流程也稍微變得複雜了一些些。
要完成實名驗證(綁定台灣信用卡),才能夠正常使用微信,沒有實名可能會無法支付。
微信支付實名驗證參考這篇:[圖文] 微信支付|只綁台灣信用\金融卡|不用別人給紅包
綁定之後可以有哪些權限(如我可以到大陸消費使用嗎?):
微信支付只綁定台灣信用卡,使用權限與金額上限

流程圖

先申請好幫幫寶與微信的帳戶
官方網站:https://www.paybao.com.tw/
  1. 註冊銀行帳戶
  2. 申請訂單(最小單是100人民幣)
    2.1. 加入幫幫寶指定帳戶好友
    2.2. 密一下說你儲值多少(可以簡單數字就好)
  3. 完成訂單付款
  4. 開心的使用微信

註冊銀行帳戶

第一次註冊完幫幫寶帳戶之後記得要綁定一個銀行帳戶,只有綁定的銀行帳戶可以匯款;匯款金額錯誤或是沒有註冊,依據幫幫寶官方的說法是會自動退回,不過要是真的出問題建議密一下客服個別處理比較安心。
再來就依據裡面所填的做即可

申請訂單

進入右上角會員專區
點擊微信錢包
2018改版後,上圖下一步後會出現兩個選項,點擊下方 已經實名
然後出現一個QR用你的微信掃一掃,之後就會出現下圖訂單頁面了
訂單成立後滾到下面有付款資訊,其中有支持超商儲值、銀行匯款等,選擇自己方便的的方付款。
*實名的微信帳戶到這裡付款完畢之後,等個5~10分鐘,系統會自動匯款,微信上會自己跳出收到款項了。




以下是選擇非實名用戶的流程,實名用戶到此就可以收到紅包了
以下是選擇非實名用戶的流程,實名用戶到此就可以收到紅包了
以下是選擇非實名用戶的流程,實名用戶到此就可以收到紅包了
提醒非實名用戶錢存進去就不能用也拿不出來


如果選擇非實名的微信帳戶

非實名的微信帳戶這裡會出現一行紅字要你去加一個帳號好友並且密語儲值多少
這裡的幫幫寶帳戶不是每個人都相同,不要照著圖填寫,你應該依據自己的網頁出現的填寫。

加入幫幫寶指定帳戶好友

開啟你的微信主頁右上角有一個 + 點一下添加朋友
然後搜尋帳戶,添加好友
密一下儲值多少 (我是事後截圖的)
可以直接說數字就好了,不用打什麼字
這裡因為我是先密了,之後隔一段時間才付款的
實際上轉帳付款後到收到人民幣沒超過5分鐘

完成訂單付款

完成之後過一陣子就會收到一個紅包

千萬注意紅包只有一天能收,不要忘記收了!!!
客服也表示不要漏收了

開心的使用微信

再來就可以正常掃馬支付了~
需要測的的話這邊提供一個連結測試,可以輸入最小額度測試
覺得文章對你有幫助的話也歡迎打賞,對我的鼓勵~
#測試連結金額自定可以選最小額測試只能用微信掃)
如何使用微信錢包儲值邏輯思維的得到APP可以參考這篇
台灣 如何儲值、購買得到APP 專欄、電子商品、書