Ингредиенты:
Класс-матрица, созданный по шаблону для типа элемента-матрицы, предназначенный для работы с подматрицами, а также с двойными / плавающими и т. Д.
Метод-член матрицы, который возвращает "истинную" диагональ, то есть в случае подматриц NxN диагонали тех, то есть вектор векторов размера N.
Как можно меньше ограничений относительно реализации субматриц и никаких ненужных «побочных эффектов» / требований, когда субматрицы не используются, а, скажем, просто удваиваются.
Бесшовное использование класса матрицы в каком-либо алгоритме, например сопряженный градиент, который в идеале должен быть просто основан на каком-то общем матричном и векторном типе.
Идея заключалась в том, чтобы предоставить функтор для GetDiagonalElements () - метода матрицы, который имеет значение по умолчанию, которое просто копирует diagional-element. Игнорируя фактический размер матрицы (только 1x1), я пытаюсь реализовать эту функциональность:
#include <vector>
template< typename T >
struct Matrix
{
std::vector<T> data;
Matrix() : data(1) {}
// Default-functor for T2=T or convertible.
template< typename T2 >
struct GetDiagonalElementsFunc
{
void operator()( const T &t1, T2 &t2 ) { t2 = (T2)t1; }
};
template< typename T2, typename GetDiagonalElementsFunctor >
void GetDiagonalElements( std::vector<T2> &diag,
GetDiagonalElementsFunctor gdeFunctor=GetDiagonalElementsFunc<T2>
{
diag.resize(1)
gdeFunctor( data[0], diag[0] );
}
};
void foo()
{
Matrix<double> mat;
std::vector<double> diag;
mat.GetDiagonalElements(diag);
}
Компилятор «сообщает»: не удалось вывести аргумент шаблона для GetDiagonalElementsFunctor.
Угадайте, что функтор, так как аргумент-шаблон не нужен - я пробовал, но не смог заставить его работать, вероятно, простой (?), Хотя любая помощь приветствуется, с уважением, Дерик.
PS: В идеале, по возможности, без лишних / промежуточных вспомогательных типов. Нет Boost, нет C ++ 11.
Дополнительный вопрос: что, если бы я хотел сделать то же самое, но указать функтор диагонального доступа как часть объявления-шаблона-матрицы (?), Как?