Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Love template metaprogramming

License

NotificationsYou must be signed in to change notification settings

brunocodutra/metal

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1,109 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Metal is a single-header C++11 library designed to make you love templatemetaprogramming.

Overview

#include<metal.hpp>// First we need some Valuesunion x {char payload[10]; };classy {public:char c; };structz {char c;int i; };// ... from which we construct some Listsusing l0 = metal::list<>;using l1 = metal::prepend<l0, x>;using l2 = metal::append<l1, z>;using l3 = metal::insert<l2, metal::number<1>, y>;static_assert(metal::same<l1, metal::list<x>>::value,"");static_assert(metal::same<l2, metal::list<x, z>>::value,"");static_assert(metal::same<l3, metal::list<x, y, z>>::value,"");// Lists are versatile, we can check their sizes...static_assert(metal::size<l0>::value ==0,"");static_assert(metal::size<l1>::value ==1,"");static_assert(metal::size<l2>::value ==2,"");static_assert(metal::size<l3>::value ==3,"");// retrieve their elements...static_assert(metal::same<metal::front<l3>, x>::value,"");static_assert(metal::same<metal::back<l3>, z>::value,"");static_assert(metal::same<metal::at<l3, metal::number<1>>, y>::value,"");// count those that satisfy a predicate...static_assert(metal::count_if<l3, metal::trait<std::is_class>>::value ==2,"");static_assert(metal::count_if<l3, metal::trait<std::is_union>>::value ==1,"");// We can create new Lists by removing elements...using l0_ = metal::drop<l3, metal::number<3>>;using l1_ = metal::take<l3, metal::number<1>>;using l2_ = metal::erase<l3, metal::number<1>>;static_assert(metal::same<l0, l0_>::value,"");static_assert(metal::same<l1, l1_>::value,"");static_assert(metal::same<l2, l2_>::value,"");// by reversing the order of elements...static_assert(metal::same<metal::reverse<l0>, metal::list<>>::value,"");static_assert(metal::same<metal::reverse<l1>, metal::list<x>>::value,"");static_assert(metal::same<metal::reverse<l2>, metal::list<z, x>>::value,"");static_assert(metal::same<metal::reverse<l3>, metal::list<z, y, x>>::value,"");// by transforming the elements...using l2ptrs = metal::transform<metal::lazy<std::add_pointer>, l2>;using l3refs = metal::transform<metal::lazy<std::add_lvalue_reference>, l3>;static_assert(metal::same<l2ptrs, metal::list<x*, z*>>::value,"");static_assert(metal::same<l3refs, metal::list<x&, y&, z&>>::value,"");// even by sorting them...template<classx,classy>using smaller = metal::number<(sizeof(x) <sizeof(y))>;using sorted = metal::sort<l3, metal::lambda<smaller>>;static_assert(metal::same<sorted, metal::list<y, z, x>>::value,"");// that and much more!

Quick Start

  1. Downloadmetal.hpp
  2. #include </path/to/metal.hpp>
  3. Love template metaprogramming

Blazingly Fast

You don't need to just take my word for it, see for yourself atmetaben.ch.

Portable

Metal is known to work on GCC, Clang, Visual Studio, and Xcode.

Documentation

The complete up-to-date documentation is availableonline.

License

This project is licensed under theMIT.


[8]ページ先頭

©2009-2026 Movatter.jp