Учебники и введение в С++ 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