C++ Templates: The Complete Guide 筆記

以下為第一至六章的筆記。

  1. 需要回傳 decay 後的型態:https://en.cppreference.com/w/cpp/types/decay
  2. std::common_type 會找出所有型態中都可以被 implicitly 轉換的型態:https://en.cppreference.com/w/cpp/types/common_type
  3. 可以用 alias template 替換多個 template parameters,如以下例子 1(取自於https://en.cppreference.com/w/cpp/language/type_alias
  4. 運算子 sizeof… 會回傳 parameter pack 的個數。
  5. C++17 的 fold expression 會展開 parameter pack 中的參數及運算子:https://en.cppreference.com/w/cpp/language/fold,請參考例子 2。
  6. 完美轉發 perfect forwarding 請參考 https://en.cppreference.com/w/cpp/utility/forward
  7. 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))>;

--

--