C++ Templates: The Complete Guide 筆記
Feb 13, 2022
以下為第一至六章的筆記。
- 需要回傳 decay 後的型態:https://en.cppreference.com/w/cpp/types/decay
- std::common_type 會找出所有型態中都可以被 implicitly 轉換的型態:https://en.cppreference.com/w/cpp/types/common_type
- 可以用 alias template 替換多個 template parameters,如以下例子 1(取自於https://en.cppreference.com/w/cpp/language/type_alias)
- 運算子 sizeof… 會回傳 parameter pack 的個數。
- C++17 的 fold expression 會展開 parameter pack 中的參數及運算子:https://en.cppreference.com/w/cpp/language/fold,請參考例子 2。
- 完美轉發 perfect forwarding 請參考 https://en.cppreference.com/w/cpp/utility/forward
- std::enable_if 可以用來實作 SFINAE (Substitution Failure Is Not An Error),但在 C++20 以後可以直接用 concept 達成此目的。https://en.cppreference.com/w/cpp/types/enable_if
Example 1:
template<class T>
struct Alloc { };
template<class T>
using Vec = vector<T, Alloc<T>>; // type-id is vector<T, Alloc<T>>
Vec<int> v; // Vec<int> is the same as vector<int, Alloc<int>>
Example 2:
template<typename T, typename ...U> array(T, U...)
-> array<enable_if_t<(is_same_v<T, U> && ...), T>,
(1 + sizeof...(U))>;