Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Жизнь во время компиляции

Anna | 24.06.2014 | нет комментариев

Статья не о том, чем заняться, пока собирается план.

Фраза «Образцы — полновесный, тьюринг-полный, язык» Зачастую понимается с недоверием. Это же легко обобщающая вероятность современных языков программирования, откуда там вычислительные вероятности? Так думал и я. Сейчас хочу переубедить остальных, заодно поясняя тезисы работы образцов для начинающих, как бы меня.

Мое осознавание образцов впервой пошатнулось позже прочтения главы «Метапрограммирование» из книги о С от создателя С — показалось, что они подлинно могут быть полновесным языком программирования внутри языка программирования. Во каждом случае, там верно есть рекурсия. Но наилучший метод подтвердить себе что-то — попытаться сделать, что мы и сделаем.

Существует уйма реализаций мифической игры «Жизнь» Джона Конвея, безрассудных и не дюже. Но все они имеют всеобщий неизбежный недочет: всякая итерация Жизни вычисляется непринужденно во время работы программы. Испробуем это поправить.

Что такое образцы

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

template <typename T>
class SomeClass 
{ 
    T i; 
};

template <class T> // class здесь — то же самое, что и typename!
T sum( T a, T b ) 
{
    return a   b;
}

SomeClass<int> obj_1;
SomeClass<double> obj_1;
double i = sum<double>( 3.14, 15.9 );

Компилятор сделает два самостоятельных класса для параметров int и double, и одну функцию sum, принимающую и возвращающую величину типа double.
Следственно образцы и именуются образцами — вы создаете классфункцию, некоторые участки не заполняете, оставляете взамен пропусков метки, перечисляете наименования этих меток перед изложением класса и все. Потом, при применении шаблонной сущности, вписываете надобные параметры в угловых скобочках и компилятор подставит их в надобные участки кода.

«Не заполнить» дозволено тип переменной, указав перед наименованием пропущенного места classtypename, либо некую величину, указав ее тип напрямую, взамен classtypename.

Правда typename и class в языке образцов имеют безусловно одно и то же значение, разницей в написании дозволено воспользоваться для облегчения понимания кода — к примеру, применять typename там, где в качестве параметра могут оказаться не только трудные, но и примитивные типы данных (plain old data), а class — там, где ожидаются экстраординарно трудные «взрослые» классы.

И все?

В всеобщем-то, да, этого довольно.

Еще желанно, Дабы компилятор соответствовал эталону С 11 и умел вычислять итоги константных выражений, содержащих примитивные функции, на этапе компиляции.

Но для облегчения кода нам потребуются псевдонимы для типов. С предоставляет 2 механизма для обзывания чего-то трудного чем-то простым: typedef и using. Конечный возник в С 11 и отличается от typedef’а (являющегося пережитком С) больше внятным синтаксисом и помощью шаблонизации:

// укажем, что "строки" — другое наименование вектора из строк
typedef std::vector<string> Strings;  // ок
using Strings = std::vector<string>; // ок

// пример взят из Википедии
typedef void (*FunctionType)(double);  // черт ногу сломит
using FunctionType = void (*)(double); // FunctionType — указатель на функцию, принимающую double, возвращающую void

// укажем, что куб — некая трехмерная матрица, содержащая значения типа T
template <typename T>
typedef Matrix<T, 3> Cube<T>; // оплошность компиляции
template <typename T>
using Cube = Matrix<T, 3>;    // ок 

Следственно, using – больше внятная и расширенная версия typedef. Знайте про typedef, но используйте using.

Что такое Жизнь

Игра Жизнь — симулятор жизни клеточек на поле. Существует много вариантов правил Жизни, но используем типичные. Живая клеточка гибнет от скуки, если соседей поменьше 2-х, либо голода, если соседей огромнее 3. В пустой клеточке зарождается жизнь только когда рядом с ней сурово 3 живые клеточки, т.е. есть родители и акушер.

Проанализируем задачу: для Жизни необходимы клеточки, пространств

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB