CppTemplateTutorial icon indicating copy to clipboard operation
CppTemplateTutorial copied to clipboard

Update for C++ 17.

Open LYP951018 opened this issue 8 years ago • 0 comments

  • 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); }};

LYP951018 avatar Jun 25 '16 03:06 LYP951018