Skip to content

Instantly share code, notes, and snippets.

View Nekrolm's full-sized avatar

Dmitry Sviridkin Nekrolm

View GitHub Profile
@Nekrolm
Nekrolm / fizzbuzz.cpp
Last active April 3, 2019 20:44
FizzBuzz on variadic templates & recursion
#include <iostream>
#include <utility>
namespace impl{
template <int N, int D, int R>
constexpr auto FizzBuzz = "";
template <int N>
constexpr auto FizzBuzz<N, 15, 0> = "fizzbuzz";
@Nekrolm
Nekrolm / enumerate.h
Created June 26, 2019 13:07
Python-style enumerator for C++
#pragma once
#include <type_traits>
#include <utility>
#include <cstddef>
#include <algorithm>
#include <typeinfo>
#include <iterator>
template<class Range>
//https://godbolt.org/z/tctouH
#include <iostream>
#include <random>
#include <functional>
#include <exception>
#include <cstring>
#include <chrono>
using namespace std;
@Nekrolm
Nekrolm / lens.cpp
Last active August 6, 2019 15:04
FP Lenses simple implementation (C++17)
#include <functional>
#include <iostream>
template<class ObjT, class ValueT>
using setter_t = std::function<ObjT(ObjT, ValueT)>;
template<class ObjT, class ValueT>
using getter_t = std::function<ValueT(ObjT)>;
template <class ObjT, class ValueT>
#include <type_traits>
#include <utility>
#include <cstddef>
#include <iostream>
template <class T>
class WeakPtr;
template <class T>
@Nekrolm
Nekrolm / strong_typedef.cpp
Last active October 27, 2019 10:24
simple strong_typedef system implementation
#include <type_traits>
#include <utility>
#include <iostream>
#define DECLARE_TAG_CHECKER(TAG_NAME) \
template <class T, class = void> \
struct has_##TAG_NAME##_tag : std::false_type {}; \
\
@Nekrolm
Nekrolm / cpp14_traits_2.md
Last active August 25, 2020 21:45
cpp14_traits_part2

C++14/17 type_traits Часть 2.

В предыдущей серии мы пытались сделать нечто, напоминающее проверку концепции C++20 средствами C++14/17.

У нас была функция sum, от типов аргументов которой мы требовали применимости операции +. И выглядело в конечном итоге это так:

template<typename T>
auto sum(T a, T b) -&gt; RESULT::REQUIRES&gt; {
@Nekrolm
Nekrolm / cpp14_traits.md
Created December 19, 2019 16:10
cpp14_17_traits part1

C++14/17 type_traits (пока нет concepts)

Подходит к концу 2019 год. Уже скоро C++20 станет доступен во всей своей красе. Но совсем не скоро он плотно войдет в мир промышленной разработки (сюда еще даже C++14 не везде дошел).

В С++20 появятся концепции/типажи (concepts) -- долгожданная горсть синтаксического сахара, призванная дать разработчикам возможность писать шаблоны (templates), накладывая ограничения на их параметры так, чтоб потом не было мучительно больно.

Зачем вообще накладывать ограничения?

Допустим, у нас есть такой простенький шаблон

@Nekrolm
Nekrolm / cpp14_traits_3.md
Last active August 25, 2020 21:45
cpp14_17_traits_part3

C++14/17 type_traits Часть 3.

В предыдущей серии мы изобретали нечто, называемое XXX_traits, где под XXX скрывается какой-то концепт. А сам трейт описывает, какие операции доступны для типов, реализующих данный концепт. И все взаимодействие с шаблонными параметрами происходило с помощью вспомогательной структуры.

template <class T, class S>
auto accumulate(const std::vector<T>& arr, S&& op) 
    -> RESULT<T>::REQUIRES<SummatorTraits<S>::value> {
    using STraits = SummatorTraits<S>;
@Nekrolm
Nekrolm / cpp14_17_traits_4.md
Last active November 4, 2020 08:10
cpp14_17_traits_4

C++14/17 type_traits. Часть 4.

в предыдущей серии мы изобретали CRTP. А в этой серии мы вернемся обратно к тому с чего начинали и изобретем удивительно прекрасную синтаксическую конструкцию, сравнимую по красоте с концептами.

Пусть наша задача написать свой собственный std::bit_cast. C++20, конечно, вышел, но до продакшена везде и повсюду ему далеко, так что такая задача вполне может быть.

bit_cast позволяет посмотреть на значение одного типа, как будто бы это значение совершенно другого типа. Как reinterpret_cast, только без нарушения strict aliasing rule и провоцирования UB.

В простейшем и очень не правильном виде, bit_cast реализуется так: