Рубрика «c++» - 248

Мы с Vass записали и выложили первую серию второго сезона подкаста «Заметки о Qt».
Подкаст «Заметки о Qt» s02e01
Сам подкаст на rpod.ru — qt-notes.rpod.ru/284337.html
Теперь с конкурсом!
Читать полностью »

Всем доброго времени суток.

Придумано и написоно под влиянием некоторых публикаций Страуструпа на тему концептов в C++.
Захотелось мне однажды необычного — сделать так, чтобы нешаблонные функции/методы на C++ могли принимать в качестве аргумента любой объект, имеющий определенный набор методов, примерно так:

void fn(VectorWrapper<int> x)
{
    for (size_t i = 0; i < x.size(); ++i)
    {
        doSomething(x[i]);
    }
}

::std::vector<int> sv;
QList<int> qv;
OtherSuperVector<int> ov;

fn(sv);
fn(qv);
fn(ov);

Причем сделать это не используя наследование от базового класса.
Как это можно сделать, читайте под катом.
Читать полностью »

Disclaimer: На данный момент я не располагаю достаточным опытом работы с С++11, поэтому все рассуждения следует рассматривать исключительно в контексте С++03, однако буду рад обсудить в комментариях взаимодействие нововведений С++ с рассмотренными в статье проблемами.

Ссылки в C++ появились чтобы удовлетворить синтаксические потребности механизма перегрузки операторов. В чистом С нет ссылочных типов, вместо этого есть понятие lvalue, которое описывается размытой формулировкой «то, что может стоять слева от оператора присваивания».

// Чистый C
int a;
int foo(int);
a = 7; // тип a - int
5 = 7; // и тип 5 - int
foo(42) = 7; // и тип foo(42) - тоже int 

В этом маленьком примере три выражения: переменная a, литерал «5» и вызов функции foo(42) — имеют одинаковый тип — int, но только переменная является lvalue и может стоять слева от оператора присваивания.

С точки зрения С программиста, выражение «foo(42) = 7;» лишено здравого смысла и не должно компилироваться, однако с появлением перегрузки операторов, возникла потребность именно в таких выражениях.

Читать полностью »

image
Недавно возился с нормальной инициализацией окна + OpenGL, и стояла задача задетектить все мониторы и их разрешения. Оставлю тут решение для потомков.
Читать полностью »

imageС незапамятных времен в Visual Studio существовала возможность написания визуализаторов для своих C++ типов, что позволяет изменить способ отображения типов в окнах отображающих содержимое переменных в отладчике (такие как auto, watch, locals и всплывающие подсказки для переменных). В Visual Studio 2012 появилась возможность в расширениях к Visual Studio распространять визуализаторы в новом формате natvis.

Были конвертированы старые визуализаторы для Boost'а и мои старые для TinyXML, а также добавил новые визуализаторы для Boost, wxWidgets и TinyXML2. Получилось в итоге расширение к Visual Studio 2012 — C++ Debugger Visualizers
Читать полностью »

Копировать элементы из одного контейнера в другой? Нет ничего проще, универсальный алгоритм помещается в 5 строк:

template<class InputIterator, class OutputIterator>
OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result) {
    while(first != last) *result++ = *first++;
    return result;
}

Возможно вы узнали реализацию std::copy с cplusplus.com. Почему же реализация std::copy из GNU STL занимает 139 строк? Давайте разберемся.Читать полностью »

Многие программисты очень любят обвинять компилятор в различных ошибках. Поговорим немного об этом.
Читать полностью »

Дворец творчества на Воробьевых горах приглашает учащихся 7-10 классов на курсы ИТ по следующим направлениям:

  • Программирование сайтов: HTML, CSS, PHP, MySQL;
  • Программирование в C/C++.

Обучение бесплатное.

На первом году обучения изучается теория «с нуля». На втором году дети реализуют собственные проекты (программы, сайты) под руководством педагога. Успешные (работоспособные (-: ) проекты отправляются весной на конференции, конкурсы и выставки: городские, российские и международные. Примеры проектов есть на сайте.
Учебный класс оборудован современными компьютерами и проектором. Занятие ведут, как правило, студенты технических ВУЗов.

Читать полностью »

Я люблю язык C за его простоту и эффективность. Тем не менее, его нельзя назвать гибким и расширяемым. Есть другой простой язык, обладающий беспрецедентной гибкостью и расширяемостью, но проигрывающий C в эффективности использования ресурсов. Я имею в виду LISP. Оба языка использовались для системного программирования и имеют давнюю и славную историю.

Уже достаточно долго я размышляю над идеей, объединяющей подходы обоих этих языков. Её суть заключается в реализации языка программирования на основе LISP, решающего те же задачи, что и C: обеспечение высокой степени контроля над оборудованием (включая низкоуровневый доступ к памяти). На практике это будет система LISP-макросов, генерирующая бинарный код. Возможности LISP для препроцессирования исходного кода, как мне кажется, обеспечат небывалую гибкость, в сравнении с препроцессором C или шаблонами C++, при сохранении исходной простоты языка. Это даст возможность на базе такого DSL надстраивать новые расширения, повышающие скорость и удобство разработки. В частности, на этом языке может реализовываться и сама LISP-система.

Написание компилятора требуют наличие кодогенератора, а в конечном итоге — ассемблера. Поэтому практические изыскания стоит начинать с реализации ассемблера (для подмножества инструкций целевого процессора). Мне было интересно минимизировать какие-либо зависимости от конкретных технологий, языков программирования и операционной системы. Поэтому я решил с нуля реализовать на C простейший интерпретатор импровизированного LISP-диалекта, а также написать к нему систему макрорасширений, позволяющих удобно кодировать на подмножестве ассемблера x86. Венцом моих усилий должен стать результирующий загрузочный образ, выводящий «Hello world!» в реальном режиме процессора.

На текущий момент мною реализован работающий интерпретатор (файл int.c, около 900 строк C-кода), а также набор базовых функций и макросов (файл lib.l, около 100 строк LISP-кода). Кому интересны принципы выполнения LISP-кода, а также подробности реализации интерпретатора, прошу под кат.
Читать полностью »

в 8:07, , рубрики: c++, qt, Qt Software, метки: ,

Приходилось часто работать с классом QDataStream. В результате накопил некоторый опыт, как правильно его использовать.

Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js