Bevált C++ technikák 2007.12.10. Budapest. Tartalom Funktor, boost.{bind, lambda} Static assert Boost.spirit Template metaprogramming Preprocessor metaprogramming.

Slides:



Advertisements
Similar presentations
Boost Writing better code faster with Boost. Boost Introduction Collection of C++ libraries Boost includes 52 libraries, 1.31 will have at least.
Advertisements

Continuation of chapter 6…. Nested while loop A while loop used within another while loop is called nested while loop. Q. An illustration to generate.
Programming for Beginners Martin Nelson Elizabeth FitzGerald Lecture 3: Flow Control I: For Loops.
C++ crash course Class 10 practice problems. Pointers The following function is trying to swap the contents of two variables. Why isnt it working? void.
Doubly linked list concept Node structure Insertion sort Insertion sort program with a doubly linked list.
1 / / / /. 2 (Object) (Object) –, 10 (Class) (Class) –, –, – (Variables) [ Data member Field Attribute](, ) – (Function) [ Member function Method Operation.
1 Pointers and Strings Section 5.4, , Lecture 12.
For(int i = 1; i
Brown Bag #2 Advanced C++. Topics  Templates  Standard Template Library (STL)  Pointers and Smart Pointers  Exceptions  Lambda Expressions  Tips.
 Pointers, Arrays, Destructors Is this random stuff or are these somehow connected?
CS 141 Computer Programming 1 1 Arrays. Outline  Introduction  Arrays  Declaring Arrays  Examples Using Arrays  Sorting Arrays  Multiple-Subscripted.
Starting Out with C++, 3 rd Edition 1 Chapter 10 – Characters, Strings, and the string Class.
Overview  Miscellaneous Utility Functions  Return Type Deduction  Generic Lambdas  Generalised Lambda Captures  C++14 Literals  constexpr Functions.
Picture It Very Basic Game Picture Pepper. Original Game import java.util.Scanner; public class Game { public static void main() { Scanner scan=new Scanner(System.in);
static void Main() { int i = 0; if (i == 0) { int a = 5; int b = 15; if (a == 5) { int c = 3; int d = 99; }
Vectors, lists and queues

XII CBSE Previous Year Question Paper QUESTION NO 1 (C) 2 Marks.
Chapter 7 Sorting Part II. 7.3 QUICK SORT Example left right pivot i j 5 > pivot and should go to the other side. 2 < pivot and should go to.
LCS Non-Dynamic Version int function lcs (x, y, i, j) begin if (i = 0) or (j = 0) return 0; else if (x[i] = y[j]) return lcs(x, y, i-1, j-1)+1; else return.
Array_strcpy void array_strcpy(char dest[], char src[]) { int i = 0; while (src[i] != '\0') { dest[i] = src[i]; i++; } dest[i] = '\0'; }
Sort the given string, without using string handling functions.
Tinaliah, S. Kom.. * * * * * * * * * * * * * * * * * #include using namespace std; void main () { for (int i = 1; i
Triana Elizabeth, S.Kom. #include using namespace std; void main () { for (int i = 1; i
By Senem Kumova Metin 1 POINTERS + ARRAYS + STRINGS REVIEW.
List Chapter 9 : Arrays and Vectors Mechanism for representing lists.
Templates & STL Instructor: 小黑. Templates  Template serves as a class outline, from which specific classes are generated at compile time.  One template.
C++ Training Datascope Lawrence D’Antonio Lecture 3 An Overview of C++
S: Application of quicksort on an array of ints: partitioning.
Презентація за розділом “Гумористичні твори”
Центр атестації педагогічних працівників 2014
Галактики і квазари.
Характеристика ІНДІЇ.
Процюк Н.В. вчитель початкових класів Боярської ЗОШ І – ІІІ ст №4
OOPDA Review. Terminology class-A template defining state and behavior class-A template defining state and behavior object-An instance of a class object-An.
CSE 332: C++ Algorithms II From Last Time: Search with Generic Iterators Third generalization: separate iterator type parameter We arrive at the find algorithm.
Binary Trees Definition A binary tree is: (i) empty, or (ii) a node whose left and right children are binary trees typedef struct Node Node; struct Node.
Духовні символи Голосіївського району
Binary Trees In computer science, a binary tree is a tree data structure in which each node has at most two children, which are referred to as the left.
1 Advanced Programming Examples Output. Show the exact output produced by the following code segment. char[,] pic = new char[6,6]; for (int i = 0; i
Copyright © Curt Hill Generic Functions Separating Data Type from Logic.
Current Assignments Project 3 has been posted, due next Tuesday. Write a contact manager. Homework 6 will be posted this afternoon and will be due Friday.
using System; namespace Demo01 { class Program
© המרכז להוראת המדעים האוניברסיטה העברית בירושלים
C++ Functions, Classes, and Templates
Introduction to Programming
Проф. д-р Васил Цанов, Институт за икономически изследвания при БАН
ЗУТ ПРОЕКТ на Закон за изменение и допълнение на ЗУТ
О Б Щ И Н А С И Л И С Т Р А П р о е к т Б ю д ж е т г.
Електронни услуги на НАП
Боряна Георгиева – директор на
РАЙОНЕН СЪД - БУРГАС РАБОТНА СРЕЩА СЪС СЪДЕБНИТЕ ЗАСЕДАТЕЛИ ПРИ РАЙОНЕН СЪД – БУРГАС 21 ОКТОМВРИ 2016 г.
Сътрудничество между полицията и другите специалисти в България
Съобщение Ръководството на НУ “Христо Ботев“ – гр. Елин Пелин
НАЦИОНАЛНА АГЕНЦИЯ ЗА ПРИХОДИТЕ
ДОБРОВОЛЕН РЕЗЕРВ НА ВЪОРЪЖЕНИТЕ СИЛИ НА РЕПУБЛИКА БЪЛГАРИЯ
Съвременни софтуерни решения
ПО ПЧЕЛАРСТВО ЗА ТРИГОДИШНИЯ
от проучване на общественото мнение,
Васил Големански Ноември, 2006
Програма за развитие на селските райони
ОПЕРАТИВНА ПРОГРАМА “АДМИНИСТРАТИВЕН КАПАЦИТЕТ”
БАЛИСТИКА НА ТЯЛО ПРИ СВОБОДНО ПАДАНЕ В ЗЕМНАТА АТМОСФЕРА
МЕДИЦИНСКИ УНИВЕРСИТЕТ – ПЛЕВЕН
Стратегия за развитие на клъстера 2015
Моето наследствено призвание
Правна кантора “Джингов, Гугински, Кючуков & Величков”
Безопасност на движението
class PrintOnetoTen { public static void main(String args[]) {
Structures in c By Anand George.
Presentation transcript:

Bevált C++ technikák Budapest

Tartalom Funktor, boost.{bind, lambda} Static assert Boost.spirit Template metaprogramming Preprocessor metaprogramming Concepts Irodalom, contact

Fabejárás template struct Tree { Tree* left; Tree* right; Data* data; }; template void preorder(Tree * tree) { if (tree->data) [process *tree->data] if (tree->left) preorder(tree->left); if (tree->right) preorder(tree->right); } 1. void printData(Data&); 2. class MyClass { // … void processData(Data&); } myClass; 3. void printData2(Data&, int param); 4. class MyClass { // … void processData2(Data&, int); } myClass;

Fabejárás, függvénypointer 1. void printData(Data&); 2. class MyClass { // … void processData(Data&); } myClass; 3. void printData(Data&, int param); 4. class MyClass { // … void processData(Data&, int); } myClass; template void preorder(Tree * tree, void (*f)(Data&)) { if (tree->data) (*f)(*tree->data); if (tree->left) preorder(tree->left, f); if (tree->right) preorder(tree->right, f); }

Fabejárás, STL funktor Hátrány: mindig új típust (osztályt) kell létrehozni egy operator()(Data&) művelettel template void preorder(Tree * tree, Functor f) { if (tree->data) f(*tree->data); if (tree->left) preorder(tree->left, f); if (tree->right) preorder(tree->right, f); } struct printDataFunctor { void operator()(Data& d) { printData(d); } };

Boost.bind Tree szavak; preorder(&szavak, boost::bind(&printData, _1)); preorder(&szavak, boost::bind(&MyClass::processData, &myClass, _1)); preorder(&szavak, boost::bind(&printData2, _1, 5)); preorder(&szavak, boost::bind(&MyClass::processData2, &myClass, _1, 5)); struct X { std::string name }; std::find_if(first, last, bind(&X::name, _1) == "peter"); std::sort(first, last, bind(&X::name, _1) < bind(&X::name, _2));

Tartalom Funktor, boost.{bind, lambda} Static assert Boost.spirit Template metaprogramming Preprocessor metaprogramming Concepts Irodalom, contact

Static assert template class StaticAssert; template<> class StaticAssert {}; template class Array { public: char data[1 << size]; StaticAssert sizeConstraint; }; Array array8; // ok Array array10; // error

Tartalom Funktor, boost.{bind, lambda} Static assert Boost.spirit Template metaprogramming Preprocessor metaprogramming Concepts Irodalom, contact

Boost.spirit, calculator group ::= '(' expression ')‘ factor ::= integer | group term ::= factor (('*' factor) | ('/' factor))* expression ::= term (('+' term) | ('-' term))* (-1 + 2) * (3 + -4) 1 + ((6 * 200) - 20) / 6 struct calculator : public grammar { template struct definition { definition(calculator const& self) { group = '(' >> expression >> ')'; factor = integer | group; term = factor >> *(('*' >> factor) | ('/' >> factor)); expression = term >> *(('+' >> term) | ('-' >> term)); } rule expression, term, factor, group; rule const& start() const { return expression; } };

Boost.spirit, actions void do_int(char const* str, char const* end); void do_add(char const*, char const*); void do_subt(char const*, char const*); void do_mult(char const*, char const*); void do_div(char const*, char const*); void do_neg(char const*, char const*); expression = term >> *( ('+' >> term)[&do_add] | ('-' >> term)[&do_subt] ) ; term = factor >> *( ('*' >> factor)[&do_mult] | ('/' >> factor)[&do_div] ) ; factor = lexeme_d[(+digit_p)[&do_int]] | '(' >> expression >> ')' | ('-' >> factor)[&do_neg] | ('+' >> factor) ; DSEL – Domain Specific Embedded Language

Tartalom Funktor, boost.{bind, lambda} Static assert Boost.spirit Template metaprogramming Preprocessor metaprogramming Concepts Irodalom, contact

Template metaprogramming template class Factorial { public: enum { value = N*Factorial ::value }; }; template<> class Factorial { public: enum { value = 1 }; }; int main () { return Factorial ::value; }

Template metaprogramming (2) // accumulate(n,f) := f(0) + f(1) f(n) template class F> struct Accumulate { enum { RET=Accumulate ::RET+F ::RET }; }; template class F> struct Accumulate { enum { RET = F ::RET }; }; template struct Square { enum { RET = n*n }; }; int main() { return Accumulate ::RET; // 0^2 + 1^2 + 2^2 + 3^2 = 14 }

Type list struct Null {}; template struct TList { typedef H Head; typedef T Tail; }; typedef TList > > integral_types; template struct TListCount; template struct TListCount > { enum { Result = 1 + TListCount ::Result }; }; template<> struct TListCount { enum { Result = 0 }; }; const int n = TListCount ::Result; // 3

Generated class hierarchy template struct Hierarchy; template struct Hierarchy > : public H, public Hierarchy {}; template<> struct Hierarchy {}; Hierarchy > > > template Base> struct Hierarchy2; template Base> struct Hierarchy2, Base> : public Base, public Hierarchy {}; template Base> struct Hierarchy2 {}; A B C Base

Tartalom Funktor, boost.{bind, lambda} Static assert Boost.spirit Template metaprogramming Preprocessor metaprogramming Concepts Irodalom, contact

Boost.preprocessor #define TLIST_OP(s,x,h)TList<h, #define ENDBRACKET(item, n, data)> #define TLIST(t) \ BOOST_PP_SEQ_FOR_EACH(TLIST_OP, x, t) Null \ BOOST_PP_REPEAT(BOOST_PP_SEQ_SIZE(t), ENDBRACKET, data) typedef TLIST((short)(int)(long)) integrals;

Tartalom Funktor, boost.{bind, lambda} Static assert Boost.spirit Template metaprogramming Preprocessor metaprogramming Concepts Irodalom, contact

Concepts template where Assignable void fill(Fwd first, Fwd last, const T& t); concept Assignable { Var a; Var b; a = b; }; assert Assignable >;

Tartalom Funktor, boost.{bind, lambda} Static assert Boost.spirit Template metaprogramming Preprocessor metaprogramming Concepts Irodalom, contact

A.Alexandrescu: Modern C++ Design D.Abrahams, A.Gurtovoy: C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond Boost libraries: Specifying C++ concepts: std.org/JTC1/SC22/WG21/docs/papers/2005/n1886.pdf Mihalicza József