マトリックスとそれらのマトリックスに対する操作を含むライブラリを作成することにより、テンプレートのスキルを向上させようとしています (私はほとんど知りません)。基本的に、行列を非常に強く型付けし (コンパイル時にデータ型とサイズがわかる)、転置行列の型を自動的に推定できるようにしたいと考えています。
template< typename TDataType, size_t rows, size_t cols > class MyMatrix
行列は入れ子にするTDataType
ことができるので、整数型にすることもできますが、MyMatrix<...>
単独で行うこともできます。これにより、転置行列のデータ型が元の行列のデータ型と必ずしも同じになるとは限りません。たとえば、
Transpose( MyMatrix< MyMatrix< char, 2, 3 >, 4, 6 > ) ==> MyMatrix< MyMatrix< char, 3, 2 >, 6, 4 >
(外部行列のデータ型が変更された)
転置型推定の私の最初の試みは次のとおりです。
template< typename TDataType >
struct Transpose
{
typedef TDataType type;
};
template<>
struct Transpose< MyMatrix<TDataType, rows, cols> >
{
typedef MyMatrix<typename Transpose<TDataType>::type, cols, rows> type;
};
Transpose-template を MyMatrix (TDataType 不明および同様のエラー) で特殊化できないように見えるため、これを行う方法が見つかりませんでした。
私が思いついた唯一のコンパイル可能なソリューションは次のとおりです(まだ機能するかどうかさえわかりません):
template< typename TMatrixType, typename TDataType, size_t rows, size_t cols >
struct Transpose
{
typedef TMatrixType type;
};
template< typename TDataType, size_t rows, size_t cols >
struct Transpose< MyMatrix<TDataType, rows, cols>, TDataType, rows, cols >
{
typedef MyMatrix< typename Transpose<TDataType,TDataType,rows,cols>::type, cols, rows > type;
};
私は物事を複雑にしすぎていると思います。私が望むものを達成するためのより簡単な解決策はありますか?
私の質問への回答への回答 (私はアカウントなしで質問を投稿したので、通常の方法で物事を行うのに十分な担当者がいません)。もう本当にありがとう!
@Bo Persson @Will A : これを汎用行列ライブラリとして使用するつもりはありません。特定の (事前にわかっている) サイズの行列に対して操作を実行し、このアプローチを使用してどこに到達できるかを確認したいと考えています。これにより、行列のメモリ レイアウトを最適化し (たとえば、行ベクトルを 32 バイト境界に揃える)、その他のファンキーなことを実行できるようになります。これを行うことで何度も自分の足を撃つことを期待していますが、ここで得ようとしている主なことは経験であり、何が機能し、何が機能しないかを見つけます (そして、何が難しいか、何がそうでないか) 't)。
@Bo Perrson : 最初のバージョンがコンパイルされない理由はわかっていますが、2 回目の試行で動作するより単純なバージョンがあるかどうか疑問に思っていました。主な問題は、MyMatrix がクラス テンプレート自体であり、そのテンプレート引数をどうにかして Transpose-struct に取得する必要があることです。
@VJo:うまくいかないと思います。T が MyMatrix<..> 自体である場合、転置行列はTranspose<T>
T 自体ではなく、データ型として持つ必要があります。すべての基本型 (char、int、double...) については、もちろんこれは正しく、より簡単です。