CppTemplateTutorial
CppTemplateTutorial copied to clipboard
Update for C++ 17.
-
void_t
idiom[1]
template<typename T, typename = void>
struct HasReference : std::false_type {};
template<typename T>
struct HasReference<T, std::void_t<typename T::reference>> : std::true_type {};
[1] CppCon 2014: Walter E. Brown "Modern Template Metaprogramming: A Compendium, Part II"
- type_traits_v
借助于 C++ 14 的 variable templates:
is_same_v
... -
constexpr if
可以干掉 Tag Dispatch:
template<typename Iterator>
Iterator next(Iterator iter, std::ptrdiff_t dist)
{
using category = typename std::iterator_traits<Iterator>::iterator_category;
constexpr if(std::is_base_of_v<std::random_access_iterator_tag, category>)
return iter + dist;
else constexpr if(std::is_base_of_v<std::input_iterator_tag, category>)
{
for(std::ptrdiff_t i = 0; i < dist; ++i)
++iter;
return iter;
}
}
-
std::conjunction/std::disjunction/std::negation
template<typename... TArgs, typename... UArgs>
struct BeExplicit: std::conjunction<std::is_constructible<TArgs, UArgs>..., std::disjunction<std::negation<std::is_convertible<UArgs, TArgs>>...>> {};
template <auto x>
constexpr auto constant = x;
constant<true> c1;
constant<2> c2;
std::tuple t{1, 2.0, "haha"s}; //std::tuple<int, double, std::string>
std::unique_ptr handle{::CreateFile(xxx), [](auto h) noexcept { ::CloseHandle(h); }};