SlideShare une entreprise Scribd logo
1  sur  33
Télécharger pour lire hors ligne
Reflection в C++ и коты
Василий Немков
Немного о себе
Что такое Reflection?
● Reflection (рефлексия) - способность программы наблюдать и менять
свою структуру.
Что такое Reflection?
class Cat:
class Color(Enum):
White = 0
Red = 1
Gray = 2
Black = 3
class Sex(Enum):
Female = 0
Male = 1
def __init__(self, name, birthday, furColor, sex):
self.name = name
self.birthday = birthday
self.furColor = furColor
self.sex = sex
cat = Cat('Bonch', datetime.date(2010, 9, 10), Cat.Color.Red, Cat.Sex.Female)
Что такое Reflection?
>>> dir(cat)
['Color', 'Sex', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__',
'__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__',
'__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'birthday',
'furColor', 'name', 'sex']
>>> dir(Cat)
['Color', 'Sex', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__',
'__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__',
'__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
Что такое Reflection?
>>> dir(cat)
['Color', 'Sex', … , 'birthday', 'furColor', 'name', 'sex']
>>> dir(Cat)
['Color', 'Sex', … , '__str__', '__subclasshook__', '__weakref__']
Что такое Reflection?
>>> dir(cat)
['Color', 'Sex', … , 'birthday', 'furColor', 'name', 'sex']
>>> dir(Cat)
['Color', 'Sex', … , '__str__', '__subclasshook__', '__weakref__']
>>> dir(1)
['__abs__', '__add__', '__and__', … , 'numerator', 'real', 'to_bytes']
>>> dir(len)
['__call__', '__class__', '__delattr__', … , '__text_signature__']
>>> dir(math)
['__doc__', '__loader__', '__name__', … , 'tan', 'tanh', 'trunc']
Что такое Reflection?
● Reflection (рефлексия) - способность программы наблюдать и менять
свою структуру во время исполнения
● Языки в которых поддерживается reflection: Java, C# (.Net), Python, D...
● Compile-time reflection vs run-time reflection
Варианты использования reflection:
● Сериализация
● Интеграция с плагинами и скриптами
● Операторы сравнения
● Изменение кода в процессе выполнения
CMS - Cat Management System
class Cat {
enum FurColor {
White = 0,
Red = 1,
Gray = 2,
Black = 4
};
enum Sex {
Female = 0,
Male = 1
};
std::string name;
std::time_t birthday;
std::bitset<8> furColor;
Sex sex;
};
Сериализация
● Что такое сериализация?
● Зачем её использовать?
● Форматы: JSON, XML, protobuf и т.д.
Рефлексия вручную
void serialize(Cat const& cat, Json::Value* dest)
{
(*dest)["name"] = cat.name;
(*dest)["birthday"] = cat.birthday;
(*dest)["furColor"] = cat.furColor;
(*dest)["sex"] = cat.sex;
}
void deserialize(Json::Value const& source, Cat* cat)
{
cat->name = source["name"].asString();
cat->birthday = source["birthday"].asInt64();
cat->furColor = source["furColor"].asUInt();
cat->sex = static_cast<Cat::Sex>(source["sex"].asUInt());
}
Рефлексия вручную
Плюсы
● Простота
● Полный контроль над тем, как сериализуетсядесериализуется объект
Минусы
● Много однотипного кода, приходится писать каждый раз для всех классов.
● Хрупкость - легко забыть добавить обработку нового атрибута.
Рефлексия с помощью Qt
● Meta-object system
● Meta-object compiler
● Run-time reflection
Рефлексия с помощью Qt
class qtCat : public QObject {
Q_OBJECT
public:
explicit qtCat(QObject *parent = 0);
enum FurColor {White = 0, Red = 1, Gray = 2, Black = 4};
Q_DECLARE_FLAGS(FurColorFlag, FurColor)
Q_FLAG(FurColorFlag)
enum Sex {Female = 0, Male = 1};
Q_ENUM(Sex)
Q_PROPERTY(QString name)
Q_PROPERTY(QDateTime birthday)
Q_PROPERTY(FurColorFlag furColor)
Q_PROPERTY(Sex sex)
};
Рефлексия с помощью Qt
void serialize(QObject const& source, QJsonObject* json) {
forEachProperty(source, [json](const QObject& source, const QMetaProperty& property) {
const char* name = property.name();
const QVariant& value = property.read(&source);
(*json)[name] = QJsonValue::fromVariant(value);
});
}
void deserialize(const QJsonObject& json, QObject* dest) {
forEachProperty(*dest, [&json](QObject& dest, const QMetaProperty& property) {
const char* name = property.name();
property.write(&dest, json[name].toVariant());
});
}
Рефлексия с помощью Qt
template <typename T, typename Functor>
void forEachProperty(T& object, Functor functor) {
const QMetaObject* metaobject = object.metaObject();
for (int i = 0; i < metaobject->propertyCount(); ++i) {
const QMetaProperty& property = metaobject->property(i);
if (property.enclosingMetaObject() != metaobject || !property.isWritable())
continue;
functor(object, property);
}
}
Рефлексия с помощью Qt
Плюсы
● Широкая поддержка платформ и компиляторов.
● Работает уже сейчас!
● Один код для сериализации всех наследников QObject
Минусы
● Необходимо декорировать перечисления и свойства.
● Дополнительный шаг при сборке.
● Run-time only!
● Qt
Рефлексия с помощью Boost
● Boost.Fusion
● BOOST_FUSION_ADAPT_STRUCT
● BOOST_FUSION_DEFINE_STRUCT
● Fusion + MPL для доступа к полям.
Рефлексия с помощью Boost
class Cat {
enum FurColor {/*...*/};
enum Sex {/*...*/};
std::string name;
std::time_t birthday;
std::bitset<8> furColor;
Sex sex;
};
BOOST_FUSION_ADAPT_STRUCT(
Cat,
name,
birthday,
furColor,
sex
)
enum FurColor {/*...*/};
enum Sex {/*...*/};
BOOST_FUSION_DEFINE_STRUCT_INLINE(
Cat,
(std::string, name)
(std::time_t, birthday)
(std::bitset<8>, furColor)
(Sex, sex)
)
Рефлексия с помощью Boost
template<typename T, typename N>
void serialize(const T& object, Json::Value* json)
{
char const* name = boost::fusion::extension::struct_member_name<T, N::value>::call();
ToJson(boost::fusion::at<N>(object), &(*json)[name]);
}
template<typename T, typename N>
void deserialize(const Json::Value& json, T* object)
{
char const* name = boost::fusion::extension::struct_member_name<T, N::value>::call();
if (!json.isMember(name))
return;
FromJson(json[name], boost::fusion::at<N>(object));
}
Рефлексия с помощью Boost
Плюсы
● Широкая поддержка платформ и компиляторов.
● Работает уже сейчас!
● Compile-time
Минусы
● Необходимо декорировать перечисления и свойства.
● Шаблонная магия
● Boost
Рефлексия в C++11/14
#include <type_traits>
struct B {};
struct D : public B {};
std::is_pod<B>::value; // true
std::is_class<B>::value; // true
std::is_abstract<B>::value; // false
std::is_base_of<B, D>::value; // true
int a[10][3];
std::extent<decltype(a)>::value; // 10
std::extent<decltype(a), 1>::value; // 3
Рефлексия в С++17 ?
Рефлексия в С++17 ?
Рефлексия в С++??
● SG7 - Study group 7 - Reflection
● N4428 (std::class_traits, std::enum_traits)
● P0255 (`typedef<T,C>`, `typename<T,C>`, `typeid<T,C>`)
● P0194 + P0385 (reflexpr)
Рефлексия в С++?? / N4428
● std::enum_traits
● std::class_traits
● get<N> для доступа к элементам
● Нет возможности получить содержимое namespace
Рефлексия в С++?? / P0255
● typedef<T, C>
● typename<T, C>
● typeid<T, C>
● Дополнительные type traits (is_local, is_private, … )
Рефлексия в С++?? / P0255
template <typename T, ArithmeticMember MemberPtr>
void field_to_json(std::ostream& out, const T& v, MemberPtr member ) {
out << std::quoted(typeid<MemberPtr>... ) << ’:’ << v.*member;
}
template <typename T, StringMember MemberPtr>
void field_to_json(std::ostream& out, const T& v, MemberPtr member ) {
out << std::quoted(typeid<MemberPtr>...) << ’:’ << std::quoted( v.*member );
}
template <typename T, typename MemberPtr>
void field_to_json(std::ostream& out, const T& v, MemberPtr member ) {
out << std::quoted(typeid<MemberPtr>...) << ’:’;
class_to_json(out, v.*member);
}
Рефлексия в С++?? / P0255
template <typename T, typename _first, typename ..._rest>
void class_to_json_helper(std::ostream& out, const T& v, const _first& first, const _rest&
... rest) {
our << ’{’;
field_to_json( out, v, first );
(((out << ’,’), field_to_json( out, v, rest )),...);
return our << ’}’;
}
template <typename T>
void class_to_json(std::ostream& out, const T& v)
{
class_to_json_helper( out, v, typedef< T, IsMemObjPointer >... );
};
Рефлексия в С++?? / P0194 + P0385
● operator reflexpr()
● Патч к clang
● Библиотека mirror
svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
git clone https://github.com/matus-chochlik/clang.git
cd clang
git checkout reflexpr
cd ../../..
mkdir build-clang
cd build-clang
cmake -G "Unix Makefiles" ../llvm -DCMAKE_BUILD_TYPE=Release
make
make check-clang
Рефлексия в С++?? / P0194 + P0385
// compose rapidjson document
rapidjson::Document doc;
to_rapidjson(doc, cat);
// write to stdout
rapidjson::OStreamWrapper osw(std::cout);
rapidjson::PrettyWriter<rapidjson::OStreamWrapper> writer(osw);
doc.Accept(writer);
Ссылки
Qt
● http://doc.qt.io/qt-5/metaobjects.html
● http://doc.qt.io/qt-5/properties.html
● http://doc.qt.io/qt-5/qobject.html#Q_FLAG
Boost
● http://boost.org/libs/fusion/
● http://jrruethe.github.io/blog/2015/05/21/boost-fusion-json-serializer/
● http://coliru.stacked-crooked.com/a/6cc59d82c2dbba24
C++
● http://en.cppreference.com/w/cpp/header/type_traits
● SG7: https://groups.google.com/a/isocpp.org/forum/#!forum/reflection
● http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4428.pdf
● http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0255r0.pdf
P0194
● http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0194r2.html
● http://clang.llvm.org/get_started.html
● https://github.com/matus-chochlik/mirror
● http://matus-chochlik.github.io/mirror/doc/html/
Вопросы?

Contenu connexe

Tendances

Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияЕвгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияPlatonov Sergey
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаSergey Platonov
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Sergey Platonov
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Yauheni Akhotnikau
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptSergey Platonov
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Dima Dzuba
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Dima Dzuba
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеPython Meetup
 
хитрости выведения типов
хитрости выведения типовхитрости выведения типов
хитрости выведения типовcorehard_by
 
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Yandex
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Dima Dzuba
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4 Dima Dzuba
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Yandex
 

Tendances (20)

Parallel STL
Parallel STLParallel STL
Parallel STL
 
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияЕвгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализация
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кода
 
JRebel
JRebelJRebel
JRebel
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
 
Bytecode
BytecodeBytecode
Bytecode
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгирование
 
хитрости выведения типов
хитрости выведения типовхитрости выведения типов
хитрости выведения типов
 
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
 

En vedette

Oxygine 2 d objects,events,debug and resources
Oxygine 2 d objects,events,debug and resourcesOxygine 2 d objects,events,debug and resources
Oxygine 2 d objects,events,debug and resourcescorehard_by
 
Диаграммы состояний и c++
Диаграммы состояний и c++Диаграммы состояний и c++
Диаграммы состояний и c++corehard_by
 
Mixing c++ and python
Mixing c++ and pythonMixing c++ and python
Mixing c++ and pythoncorehard_by
 
модели акторов в с++ миф или реальность
модели акторов в с++ миф или реальностьмодели акторов в с++ миф или реальность
модели акторов в с++ миф или реальностьcorehard_by
 
Повседневный С++: алгоритмы и итераторы
Повседневный С++: алгоритмы и итераторы Повседневный С++: алгоритмы и итераторы
Повседневный С++: алгоритмы и итераторы corehard_by
 
шишки, набитые за 15 лет использования акторов в c++ v.001.3
шишки, набитые за 15 лет использования акторов в c++ v.001.3шишки, набитые за 15 лет использования акторов в c++ v.001.3
шишки, набитые за 15 лет использования акторов в c++ v.001.3corehard_by
 
строим Microkernel architecture на базе паттерна pipes and filters
строим Microkernel architecture на базе паттерна pipes and filtersстроим Microkernel architecture на базе паттерна pipes and filters
строим Microkernel architecture на базе паттерна pipes and filterscorehard_by
 
о некоторых вопросах бинарной совместимости в C++
о некоторых вопросах бинарной совместимости в C++о некоторых вопросах бинарной совместимости в C++
о некоторых вопросах бинарной совместимости в C++corehard_by
 
Антон Бикинеев, Reflection in C++Next
Антон Бикинеев,  Reflection in C++NextАнтон Бикинеев,  Reflection in C++Next
Антон Бикинеев, Reflection in C++NextSergey Platonov
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерSergey Platonov
 
Алексей Кутумов, C++ без исключений, часть 3
Алексей Кутумов,  C++ без исключений, часть 3Алексей Кутумов,  C++ без исключений, часть 3
Алексей Кутумов, C++ без исключений, часть 3Platonov Sergey
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castRoman Orlov
 
Фитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в формеФитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в формеIlia Shishkov
 
Evgeniy Muralev, Mark Vince, Working with the compiler, not against it
Evgeniy Muralev, Mark Vince, Working with the compiler, not against itEvgeniy Muralev, Mark Vince, Working with the compiler, not against it
Evgeniy Muralev, Mark Vince, Working with the compiler, not against itSergey Platonov
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines Sergey Zubkov
 
Quality assurance of large c++ projects
Quality assurance of large c++ projectsQuality assurance of large c++ projects
Quality assurance of large c++ projectscorehard_by
 
Fuzzing: The New Unit Testing
Fuzzing: The New Unit TestingFuzzing: The New Unit Testing
Fuzzing: The New Unit TestingDmitry Vyukov
 
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Mikhail Matrosov
 

En vedette (20)

Oxygine 2 d objects,events,debug and resources
Oxygine 2 d objects,events,debug and resourcesOxygine 2 d objects,events,debug and resources
Oxygine 2 d objects,events,debug and resources
 
Диаграммы состояний и c++
Диаграммы состояний и c++Диаграммы состояний и c++
Диаграммы состояний и c++
 
Mixing c++ and python
Mixing c++ and pythonMixing c++ and python
Mixing c++ and python
 
C++ references
C++ referencesC++ references
C++ references
 
модели акторов в с++ миф или реальность
модели акторов в с++ миф или реальностьмодели акторов в с++ миф или реальность
модели акторов в с++ миф или реальность
 
Повседневный С++: алгоритмы и итераторы
Повседневный С++: алгоритмы и итераторы Повседневный С++: алгоритмы и итераторы
Повседневный С++: алгоритмы и итераторы
 
шишки, набитые за 15 лет использования акторов в c++ v.001.3
шишки, набитые за 15 лет использования акторов в c++ v.001.3шишки, набитые за 15 лет использования акторов в c++ v.001.3
шишки, набитые за 15 лет использования акторов в c++ v.001.3
 
строим Microkernel architecture на базе паттерна pipes and filters
строим Microkernel architecture на базе паттерна pipes and filtersстроим Microkernel architecture на базе паттерна pipes and filters
строим Microkernel architecture на базе паттерна pipes and filters
 
о некоторых вопросах бинарной совместимости в C++
о некоторых вопросах бинарной совместимости в C++о некоторых вопросах бинарной совместимости в C++
о некоторых вопросах бинарной совместимости в C++
 
Антон Бикинеев, Reflection in C++Next
Антон Бикинеев,  Reflection in C++NextАнтон Бикинеев,  Reflection in C++Next
Антон Бикинеев, Reflection in C++Next
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптер
 
Clang tidy
Clang tidyClang tidy
Clang tidy
 
Алексей Кутумов, C++ без исключений, часть 3
Алексей Кутумов,  C++ без исключений, часть 3Алексей Кутумов,  C++ без исключений, часть 3
Алексей Кутумов, C++ без исключений, часть 3
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_cast
 
Фитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в формеФитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в форме
 
Evgeniy Muralev, Mark Vince, Working with the compiler, not against it
Evgeniy Muralev, Mark Vince, Working with the compiler, not against itEvgeniy Muralev, Mark Vince, Working with the compiler, not against it
Evgeniy Muralev, Mark Vince, Working with the compiler, not against it
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines
 
Quality assurance of large c++ projects
Quality assurance of large c++ projectsQuality assurance of large c++ projects
Quality assurance of large c++ projects
 
Fuzzing: The New Unit Testing
Fuzzing: The New Unit TestingFuzzing: The New Unit Testing
Fuzzing: The New Unit Testing
 
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
 

Similaire à C++ refelection and cats

Язык программирования C#
Язык программирования C#Язык программирования C#
Язык программирования C#Dmitri Soshnikov
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x IntroductionFedor Vompe
 
Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Yandex
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееdelimitry
 
Красота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonКрасота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonPython Meetup
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Andrey Karpov
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Pythonru_Parallels
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на PythonCodeFest
 
Ecma script 6 in action
Ecma script 6 in actionEcma script 6 in action
Ecma script 6 in actionYuri Trukhin
 
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий solit
 
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...DevDay
 
Convert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at VizorConvert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at VizorDevGAMM Conference
 
AlgoCollections (RUS)
AlgoCollections (RUS)AlgoCollections (RUS)
AlgoCollections (RUS)Anton Bukov
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)Alexander Gornik
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода Pavel Tsukanov
 

Similaire à C++ refelection and cats (20)

SECON'2014 - Павел Щеваев - Метаданные и автогенерация кода
SECON'2014 - Павел Щеваев - Метаданные и автогенерация кодаSECON'2014 - Павел Щеваев - Метаданные и автогенерация кода
SECON'2014 - Павел Щеваев - Метаданные и автогенерация кода
 
Язык программирования C#
Язык программирования C#Язык программирования C#
Язык программирования C#
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x Introduction
 
Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущее
 
Красота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonКрасота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки Python
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Python
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Python
 
Ecma script 6 in action
Ecma script 6 in actionEcma script 6 in action
Ecma script 6 in action
 
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
 
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...
 
Rgsu04
Rgsu04Rgsu04
Rgsu04
 
Rgsu04
Rgsu04Rgsu04
Rgsu04
 
Convert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at VizorConvert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at Vizor
 
AlgoCollections (RUS)
AlgoCollections (RUS)AlgoCollections (RUS)
AlgoCollections (RUS)
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 

Plus de corehard_by

C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...corehard_by
 
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...corehard_by
 
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений ОхотниковC++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотниковcorehard_by
 
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр ТитовC++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титовcorehard_by
 
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...corehard_by
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишковcorehard_by
 
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...corehard_by
 
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...corehard_by
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...corehard_by
 
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...corehard_by
 
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...corehard_by
 
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...corehard_by
 
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел ФилоновC++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филоновcorehard_by
 
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan ČukićC++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukićcorehard_by
 
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia KazakovaC++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakovacorehard_by
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухинcorehard_by
 
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...corehard_by
 
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019corehard_by
 
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019corehard_by
 
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019corehard_by
 

Plus de corehard_by (20)

C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
 
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
 
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений ОхотниковC++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
 
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр ТитовC++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
 
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
 
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
 
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
 
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
 
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
 
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
 
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел ФилоновC++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
 
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan ČukićC++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
 
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia KazakovaC++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
 
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
 
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
 
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
 
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
 

C++ refelection and cats

  • 1. Reflection в C++ и коты Василий Немков
  • 3. Что такое Reflection? ● Reflection (рефлексия) - способность программы наблюдать и менять свою структуру.
  • 4. Что такое Reflection? class Cat: class Color(Enum): White = 0 Red = 1 Gray = 2 Black = 3 class Sex(Enum): Female = 0 Male = 1 def __init__(self, name, birthday, furColor, sex): self.name = name self.birthday = birthday self.furColor = furColor self.sex = sex cat = Cat('Bonch', datetime.date(2010, 9, 10), Cat.Color.Red, Cat.Sex.Female)
  • 5. Что такое Reflection? >>> dir(cat) ['Color', 'Sex', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'birthday', 'furColor', 'name', 'sex'] >>> dir(Cat) ['Color', 'Sex', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
  • 6. Что такое Reflection? >>> dir(cat) ['Color', 'Sex', … , 'birthday', 'furColor', 'name', 'sex'] >>> dir(Cat) ['Color', 'Sex', … , '__str__', '__subclasshook__', '__weakref__']
  • 7. Что такое Reflection? >>> dir(cat) ['Color', 'Sex', … , 'birthday', 'furColor', 'name', 'sex'] >>> dir(Cat) ['Color', 'Sex', … , '__str__', '__subclasshook__', '__weakref__'] >>> dir(1) ['__abs__', '__add__', '__and__', … , 'numerator', 'real', 'to_bytes'] >>> dir(len) ['__call__', '__class__', '__delattr__', … , '__text_signature__'] >>> dir(math) ['__doc__', '__loader__', '__name__', … , 'tan', 'tanh', 'trunc']
  • 8. Что такое Reflection? ● Reflection (рефлексия) - способность программы наблюдать и менять свою структуру во время исполнения ● Языки в которых поддерживается reflection: Java, C# (.Net), Python, D... ● Compile-time reflection vs run-time reflection Варианты использования reflection: ● Сериализация ● Интеграция с плагинами и скриптами ● Операторы сравнения ● Изменение кода в процессе выполнения
  • 9. CMS - Cat Management System class Cat { enum FurColor { White = 0, Red = 1, Gray = 2, Black = 4 }; enum Sex { Female = 0, Male = 1 }; std::string name; std::time_t birthday; std::bitset<8> furColor; Sex sex; };
  • 10. Сериализация ● Что такое сериализация? ● Зачем её использовать? ● Форматы: JSON, XML, protobuf и т.д.
  • 11. Рефлексия вручную void serialize(Cat const& cat, Json::Value* dest) { (*dest)["name"] = cat.name; (*dest)["birthday"] = cat.birthday; (*dest)["furColor"] = cat.furColor; (*dest)["sex"] = cat.sex; } void deserialize(Json::Value const& source, Cat* cat) { cat->name = source["name"].asString(); cat->birthday = source["birthday"].asInt64(); cat->furColor = source["furColor"].asUInt(); cat->sex = static_cast<Cat::Sex>(source["sex"].asUInt()); }
  • 12. Рефлексия вручную Плюсы ● Простота ● Полный контроль над тем, как сериализуетсядесериализуется объект Минусы ● Много однотипного кода, приходится писать каждый раз для всех классов. ● Хрупкость - легко забыть добавить обработку нового атрибута.
  • 13. Рефлексия с помощью Qt ● Meta-object system ● Meta-object compiler ● Run-time reflection
  • 14. Рефлексия с помощью Qt class qtCat : public QObject { Q_OBJECT public: explicit qtCat(QObject *parent = 0); enum FurColor {White = 0, Red = 1, Gray = 2, Black = 4}; Q_DECLARE_FLAGS(FurColorFlag, FurColor) Q_FLAG(FurColorFlag) enum Sex {Female = 0, Male = 1}; Q_ENUM(Sex) Q_PROPERTY(QString name) Q_PROPERTY(QDateTime birthday) Q_PROPERTY(FurColorFlag furColor) Q_PROPERTY(Sex sex) };
  • 15. Рефлексия с помощью Qt void serialize(QObject const& source, QJsonObject* json) { forEachProperty(source, [json](const QObject& source, const QMetaProperty& property) { const char* name = property.name(); const QVariant& value = property.read(&source); (*json)[name] = QJsonValue::fromVariant(value); }); } void deserialize(const QJsonObject& json, QObject* dest) { forEachProperty(*dest, [&json](QObject& dest, const QMetaProperty& property) { const char* name = property.name(); property.write(&dest, json[name].toVariant()); }); }
  • 16. Рефлексия с помощью Qt template <typename T, typename Functor> void forEachProperty(T& object, Functor functor) { const QMetaObject* metaobject = object.metaObject(); for (int i = 0; i < metaobject->propertyCount(); ++i) { const QMetaProperty& property = metaobject->property(i); if (property.enclosingMetaObject() != metaobject || !property.isWritable()) continue; functor(object, property); } }
  • 17. Рефлексия с помощью Qt Плюсы ● Широкая поддержка платформ и компиляторов. ● Работает уже сейчас! ● Один код для сериализации всех наследников QObject Минусы ● Необходимо декорировать перечисления и свойства. ● Дополнительный шаг при сборке. ● Run-time only! ● Qt
  • 18. Рефлексия с помощью Boost ● Boost.Fusion ● BOOST_FUSION_ADAPT_STRUCT ● BOOST_FUSION_DEFINE_STRUCT ● Fusion + MPL для доступа к полям.
  • 19. Рефлексия с помощью Boost class Cat { enum FurColor {/*...*/}; enum Sex {/*...*/}; std::string name; std::time_t birthday; std::bitset<8> furColor; Sex sex; }; BOOST_FUSION_ADAPT_STRUCT( Cat, name, birthday, furColor, sex ) enum FurColor {/*...*/}; enum Sex {/*...*/}; BOOST_FUSION_DEFINE_STRUCT_INLINE( Cat, (std::string, name) (std::time_t, birthday) (std::bitset<8>, furColor) (Sex, sex) )
  • 20. Рефлексия с помощью Boost template<typename T, typename N> void serialize(const T& object, Json::Value* json) { char const* name = boost::fusion::extension::struct_member_name<T, N::value>::call(); ToJson(boost::fusion::at<N>(object), &(*json)[name]); } template<typename T, typename N> void deserialize(const Json::Value& json, T* object) { char const* name = boost::fusion::extension::struct_member_name<T, N::value>::call(); if (!json.isMember(name)) return; FromJson(json[name], boost::fusion::at<N>(object)); }
  • 21. Рефлексия с помощью Boost Плюсы ● Широкая поддержка платформ и компиляторов. ● Работает уже сейчас! ● Compile-time Минусы ● Необходимо декорировать перечисления и свойства. ● Шаблонная магия ● Boost
  • 22. Рефлексия в C++11/14 #include <type_traits> struct B {}; struct D : public B {}; std::is_pod<B>::value; // true std::is_class<B>::value; // true std::is_abstract<B>::value; // false std::is_base_of<B, D>::value; // true int a[10][3]; std::extent<decltype(a)>::value; // 10 std::extent<decltype(a), 1>::value; // 3
  • 25. Рефлексия в С++?? ● SG7 - Study group 7 - Reflection ● N4428 (std::class_traits, std::enum_traits) ● P0255 (`typedef<T,C>`, `typename<T,C>`, `typeid<T,C>`) ● P0194 + P0385 (reflexpr)
  • 26. Рефлексия в С++?? / N4428 ● std::enum_traits ● std::class_traits ● get<N> для доступа к элементам ● Нет возможности получить содержимое namespace
  • 27. Рефлексия в С++?? / P0255 ● typedef<T, C> ● typename<T, C> ● typeid<T, C> ● Дополнительные type traits (is_local, is_private, … )
  • 28. Рефлексия в С++?? / P0255 template <typename T, ArithmeticMember MemberPtr> void field_to_json(std::ostream& out, const T& v, MemberPtr member ) { out << std::quoted(typeid<MemberPtr>... ) << ’:’ << v.*member; } template <typename T, StringMember MemberPtr> void field_to_json(std::ostream& out, const T& v, MemberPtr member ) { out << std::quoted(typeid<MemberPtr>...) << ’:’ << std::quoted( v.*member ); } template <typename T, typename MemberPtr> void field_to_json(std::ostream& out, const T& v, MemberPtr member ) { out << std::quoted(typeid<MemberPtr>...) << ’:’; class_to_json(out, v.*member); }
  • 29. Рефлексия в С++?? / P0255 template <typename T, typename _first, typename ..._rest> void class_to_json_helper(std::ostream& out, const T& v, const _first& first, const _rest& ... rest) { our << ’{’; field_to_json( out, v, first ); (((out << ’,’), field_to_json( out, v, rest )),...); return our << ’}’; } template <typename T> void class_to_json(std::ostream& out, const T& v) { class_to_json_helper( out, v, typedef< T, IsMemObjPointer >... ); };
  • 30. Рефлексия в С++?? / P0194 + P0385 ● operator reflexpr() ● Патч к clang ● Библиотека mirror svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm git clone https://github.com/matus-chochlik/clang.git cd clang git checkout reflexpr cd ../../.. mkdir build-clang cd build-clang cmake -G "Unix Makefiles" ../llvm -DCMAKE_BUILD_TYPE=Release make make check-clang
  • 31. Рефлексия в С++?? / P0194 + P0385 // compose rapidjson document rapidjson::Document doc; to_rapidjson(doc, cat); // write to stdout rapidjson::OStreamWrapper osw(std::cout); rapidjson::PrettyWriter<rapidjson::OStreamWrapper> writer(osw); doc.Accept(writer);
  • 32. Ссылки Qt ● http://doc.qt.io/qt-5/metaobjects.html ● http://doc.qt.io/qt-5/properties.html ● http://doc.qt.io/qt-5/qobject.html#Q_FLAG Boost ● http://boost.org/libs/fusion/ ● http://jrruethe.github.io/blog/2015/05/21/boost-fusion-json-serializer/ ● http://coliru.stacked-crooked.com/a/6cc59d82c2dbba24 C++ ● http://en.cppreference.com/w/cpp/header/type_traits ● SG7: https://groups.google.com/a/isocpp.org/forum/#!forum/reflection ● http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4428.pdf ● http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0255r0.pdf P0194 ● http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0194r2.html ● http://clang.llvm.org/get_started.html ● https://github.com/matus-chochlik/mirror ● http://matus-chochlik.github.io/mirror/doc/html/