Overload #119

overload-119

Коллеги, а знаете ли вы о таком замечательном журнале как Overload? Я уже несколько выпусков как собираюсь о нем написать, но все забываю. На мой взгляд, это лучший журнал посвященный C++ разработке на данный момент. В журнале есть все, начиная от алгоритмов и структур данных, заканчивая особенностями язка C++ и оптимизацией кода.

Явное удаление функций в C++11

Думаю что все помнят что в C++03 для того, что бы сделать какой-либо класс защищенным от копирования было необходимо объявить его конструктор копирования и защищенными.

class Foo {
public:
    Foo(){}
    ~Foo(){}
private:
    Foo(const Foo&);
    Foo& operator=(const Foo&);
};

Continue reading

Получение сертификатов сайта

Практически любая, сколь-нибудь не стандартная задача выливается в часы малопродуктивного гугления, что печалит. Сегодня я искал ответ на вопрос, как в OSX получить сертификаты сайта, с которым ты планируешь общаться по HTTPS. До кучи дело осложняется тем, что все должно работать не только напрямую, но и через прокси.
Если говорить о Windows, данная задача решается довольно просто, благодаря библиотеке WinHTTP (кажется, ее так звать) и функции WinHttpQueryOption с флагом WINHTTP_OPTION_SERVER_CERT_CONTEXT, но мне-то нужно решение для OSX! И оно было найдено, как и ожидалось, в дебрях очень любимой мной библиотеки cURL. Continue reading

О двух интересных проектах

В этих ваших интернетах, за последнюю неделю, я узнал о двух проектах которые, на мой взгляд, как минимум заслуживают того, что бы о них прочитать. Речь идет о двух новых “почти ОС”, одна из которых совсем уж наброски, а вторая вполне себе рабочий прототип. Интересны системы, в первую очередь, тем на чем они написаны и в какой среде работают. Continue reading

Что бы такое посмотреть, что бы такое почитать? IV

Последнии пару дней необычайно радуют всякими интересностями. Во-первых, появилось несколько заслуживающих внимания предложений по включению в состав моего любимого языка программирования, а именно:

Ну и Майерс с Саттером понарассказали всякого:

  • An Effective C++11/14 Sampler. Первый, похоже что делает наброски к новой книге по эффективному использованию C++11;
  • One C++. А второй всячески хвалит C++ демонстрируя его пригодность для всего-всего на свете. Да, это выступление можно и не смотреть, я скорее промотал, нежели просмотрел.

Что бы такое посмотреть, что бы такое почитать? III

Надо сказать, эта неделя выдалась довольно интересной: несколько отличных статей по C++, обзор состояния C++1Y и пара выступлений о Rust.

Если говорить о C++, то отличился Саттер, выдавший одну интересную статью и небольшую головоломку:

А новости относительно Rust вообще необычайно приятны:

Да, чуть не забыл. Некоторое время назад я наткнулся на сайт с описанием основных структур данных и алгоритмов с информацией о сложности той или иной операции. Удобно сделано!

C++11 for VIM

Озаботился поддержкой C++11 для самого лучшего редактора на земле, который в кривых руках имеет всего два режима: бибикать и всё портить. Как оказалось, достаточно приемлемую поддержку можно найти тут.

Что бы такое посмотреть, что бы такое почитать? II

По моему мнению, на данный момент существуют 3 книги посвященные C++, которые должен прочитать любой C++ разработчик, который хочет хорошо знать свой основной рабочий инструмент. Continue reading

Инициализация константных переменных

В Rust мне сразу понравилась возможность присваивать переменным результат оператора if. Подобных функционал очень полезен для инициализации константных переменных без введения дополнительных функций.

fn main() {
    let someFlag = false;
    let value = if someFlag {
        -1
    } else {
        1
    };
    io::println(fmt!("value == %d", value))
}

В случае же с C++, для того что бы инициализировать константную переменную приходилось вводить дополнительную функцию или, что чаще, плевать на константность и обходиться обычной переменной. Ну а с C++11 данная проблема решается куда проще

int main() {
    bool someFlag = false;
    const auto value = [&]{
        if(someFlag)
            return -1;
        else
            return 1;
    } ();
    std::cout << "value == " << value << std::endl;
    return 0;
}

Ну и конечно не забываем про то, что это C++11

 > clang++ -std=c++11 test.cpp

P.S. подсмотренно у Саттера.

Effective C++11

Скотт Майерс выложил предварительное содержание будущей книги Effective C++11. Мне нравится, по большому счету, чтение самого содержания + немного размышлений довольно хорошо помогает понять C++11.

Moving from C++98 to C++11

  • Prefer auto to explicit type declarations.
  • Remember that auto + { expr } ⇒ std::initializer_list.
  • Prefer nullptr to 0 and NULL.
  • Prefer enum classes to enums.
  • Prefer alias templates to typedefs.
  • Declare overriding functions override.
  • Distinguish () and {} when creating objects.
  • Prefer emplacement to insertion.
  • Declare functions noexcept whenever possible.
  • Make const member functions thread-safe.
  • Avoid std::enable_if in function signatures.
  • Handle iterators where copying means moving.

Rvalue References, Move Semantics, and Perfect Forwarding

  • Distinguish universal references from rvalue references.
  • Avoid overloading on universal references.
  • Pass and return rvalue references via std::move, universal references via std::forward.
  • Assume that move operations are not present, not cheap, and not used.
  • Be aware of perfect forwarding failure cases.
  • Understand reference collapsing.

Secrets of the C++11 Threading API

  • Thread construction may throw.
  • Destroying a joinable thread calls terminate.
  • Arguments passed to std::thread, std::async, and std::call_once are unconditionally copied.
  • std::async is really two different functions with somewhat different APIs.
  • Futures from std::async are special.
  • void futures can be used for interthread communication.
  • To poll a future, use wait_for with a zero timeout.
  • Native handles let you go beyond the C++11 API.
  • Clock adjustments affect _until functions.

Lambda Expressions

  • Prefer lambdas to std::bind.
  • Prefer lambdas to variadic arguments for threading functions
  • Beware default captures in member functions.

Smart Pointers

  • Use std::make_shared whenever possible.
  • Prefer pass-by-ref-to-const to pass-by-value for std::shared_ptrs.

Miscellaneous

  • Pass by value when you’ll copy your parameter.
  • Keep abreast of standardization developments.