2010-03-26 5 views
10

Что представляют собой хорошие представления о создании систем шаблонов выражений на языке C++? Я хотел бы выразить арифметику по пользовательским типам, избегая при этом временных значений (которые могут быть большими) и узнать, как это сделать напрямую, а не применять существующую библиотеку.Учебные пособия и введение в C++ Expression Templates

Я нашел Todd Veldhuizen's original paper и пример из Josuttis C++ Templates book и статью Kreft & Langer. Он упоминается в лекции 6 курса по адресу Modern C++, ссылаясь на Josuttis. Библиотека POOMA background прекрасно представляет шаблоны экспрессии.

Я ищу простой, ясные экспозиции.

+2

подталкивания библиотека лямбда, кажется, использует эту технику. По моему опыту это очень громоздко использовать и все еще имеет множество ограничений; Я не удивлюсь, если не будет простых объяснений, как это работает. – liori

+0

boost :: lambda имеет другую цель, чем шаблоны выражений. –

ответ

5

Вы должны получить копию C++ Templates: The Complete Guide.

Пример кода, на который вы ссылаетесь, не содержит сопроводительного текста, что весьма полезно (глава по шаблонам выражений составляет 22 страницы). Без текста все, что у вас есть, это код без каких-либо комментариев или объяснений относительно того, что он делает и как и почему он это делает.

+1

Vandevoorde и Josuttis имеют единственное действительно полное описание. Тема никогда не будет * простой *, потому что это тема, которая сложна и сложна, но они делают лучшую работу. – jwismar

0

У вас есть все источники, за исключением научной книги на С ++, которая на самом деле является только оригинальной бумагой (по крайней мере, по этой теме) и довольно устарела. Вы можете посмотреть на C++ Template Metaprogramming для более современных методов, построенных из идей шаблонов выражений, но что-то «простое» не будет легко доступно, пока оно не станет простым.

0

Я предлагаю рассмотреть операторы Boost по адресу Boost Operators - Arithmetic. Это шаблонные методы, которые расширяют основные операции арифметики и сравнения.

2

Я настоятельно рекомендую посмотреть библиотеку Eric Niebler Boost.Proto. Очень тонкие вводные материалы можно найти через C++ - следующий:

http://cpp-next.com/archive/2010/08/expressive-c-introduction/

и его разговор на boost'con 2010 тоже очень интересно

6

Я нашел Expression Templates Demystified быть довольно хорошо объяснено. Он начинается с демонстрации того, как реализовать математические выражения без шаблонов и отображает основные строительные блоки и концепции.

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

IMO, статья является хорошей альтернативой главе шаблона выражения в «C++ Templates: The Complete Guide».

0

за то, что вы хотите сделать, вы должны посмотреть на код Boost.ublas, как это точно.

Начните с файла vector.hpp, а затем вернитесь в иерархию (родители vector<>). Матрицы немного сложнее, но механизм один и тот же.

Теперь я могу посоветовать не пытаться воспроизвести сложность библиотеки в первую очередь, например, ublas_expression и тому подобное. Вы можете сделать это проще, сделав свой тип базовым объектом, а затем реализовать двоичный оператор.

Посмотрите здесь: http://www.bnikolic.co.uk/blog/cpp-expression-minimal.html