Учебники и введение в С++ Expression Templates

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

Я нашел оригинальную бумагу Тодда Вельдхуйзена и пример из Josuttis С++ Templates book и статью Kreft and Langer. В Лекции 6 курса по Современный С++, ссылаясь на Josuttis. Библиотека POOMA background прекрасно представляет шаблоны выражений.

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

Ответ 1

Вы должны получить копию С++ Templates: Полное руководство.

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

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

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

Посмотрите также: http://www.bnikolic.co.uk/blog/cpp-expression-minimal.html