この質問が過度に複雑でないことを願っています。メタプログラミングは、型のオブジェクトではなく型に作用することを認識しています。ただし、1)クラスから型情報を取得し、次に2)その型情報に対するメタ関数を使用して、同じ結果を達成しようとしています。
私の状況の説明は、単純化されたコードの抜粋で次のとおりです。
私は Matrix_Base と呼んでいる行列用のテンプレート クラスを持っています。Eigen が採用したアプローチといくらか似ていますが、行列のサイズについて、コンパイル時に固定するか実行時に固定するかの 2 つの可能性を考慮しています。Matrix_Base の簡略化された宣言は次のとおりです。
template <typename Type, uint32_t rows_ = 1, uint32_t cols_ = 1,>
class Matrix_Base{
/*
...
*/
};
ランタイム サイズの行列は、引数 0 で示されます。
行列の実行時とコンパイル時のサイズ設定のチェックは非常に簡単です (boost::mpl を使用):
typedef typename mpl::if_<
typename mpl::or_<
typename mpl::equal_to<
typename mpl::int_<rows_>::type,
mpl::int_<0>
>::type,
typename mpl::equal_to <
typename mpl::int_<cols_>::type,
mpl::int_<0>
>
>::type,
mpl::true_,
mpl::false_
>::type runtime_size_type;
これはテスト済みで、正常に動作します。私のトラブルはここから始まります...
現在、上記の boost::mpl コードを次のように使用しています。
namespace internal {
template <uint32_t rows = 1, uint32_t cols_ = 1>
struct Runtime_Size_Helper {
typedef typename mpl::if_<
// REST OF THE BOOST::MPL code here //
>::type runtime_size_t
bool value() { return runtime_size_t::value;}
};
} // namespace
template <typename Type, uint32_t rows_ = 1, uint32_t cols_ = 1>
class Matrix_Base{
// ...
static constexpr uint32_t rows = rows_;
static constexpr uint32_t cols = cols_;
bool is_runtime_sized;
// ...
};
template <typename T, uint32_t R, uint32_t C>
bool Matrix_Base<T,R,C>::is_runtime_sized = internal::Runtime_Size_Helper<R,C>::value();
これにより、その mpl 関数の結果が Matrix_Base クラスのメンバーになります。ここまでは順調ですね。
インスタンス化されたオブジェクトを渡して runtime_size_type の値を決定するために、間接的な何らかの形式を使用したいと思います。コード例によると、これを判断するために必要な情報は、col と row の uint32_t パラメータのみです。
インスタンス化された Matrix_Base オブジェクトの場合、関連情報はコンパイル タイプの値から変更されません。行列のサイズは不変です。サイズは、テンプレート引数から設定されるか、ランタイム サイズの行列の場合はコンストラクターを介して設定されます。どちらの場合も、テンプレート引数は固定されており、型情報の一部です。この情報を静的変数としてクラスに保存しています。すべてのテンプレート パラメーターを my_type として typedef を追加しようとしましたtypename typename Matrix_Base<T,rows_, cols_, ...> my_type
が、Matrix_Base オブジェクトを渡すことができるメタ関数を記述する方法がわかりません (明らかに参照またはポインタとして)、関連情報を再抽出します。
必要な機能を提供する場合は、(他の) ブースト ライブラリを組み込むことに完全にオープンです。
これが明確であることを願っています。ここに不明な点がある場合、または単純にばかげている場合はお知らせください。
よろしく、シュムエル
問題をもう少し明確にするためにテキストを編集しました