私は4種類のインデックスを持つデータベースを持っています。各索引タイプにはソート順があります。つまり、静的インデックス型を知っている場合は、そのインデックス内のオブジェクトをソートするための正しいファンクタが1つあります。また、インデックス型を知った直後に、つまりコンパイル時に静的にも知られています。C++ランタイム条件付き型情報の転送
データベースには、どのインデックスを話すかを決定するランタイムスイッチステートメントが含まれています。私はその関数がインデックス(イテレータ、ほとんど)からランタイム情報を返すだけでなく、使用する静的なオーダータイプも返すようにしたいと思います。
意図を示すために、ここにいくつかの擬似コードを示します。これはそのままでは機能しません...テンプレートの特殊化を使用してgetLookupInfo(戻り型の型はポリモーフィック)を書くことができます。注:私は仮想を使用したくありません。
template <typename Iterator, typename Order>
struct LookupInfo {
typedef Order order;
uint64_t cost;
Iterator it1, it2, it3, it4;
};
LookupInfo Database::getLookupInfo(LookupData data)
{
if (data == ....) {
return LookupInfo<Iterator1, Order1>();
}
return LookupInfo<Iterator2, Order2>();
}
some_function(LookupInfo lookup_info) {
vector<Record> records(lookup_info.begin(), lookup_info.end());
sort(records.begin(), records.end(), lookup_info::order());
}
これはまったく可能ですか?
'getLookupInfo'がどのように動作するのか不思議です。私はそれがどのように呼び出されるのか見ていない。 return文は戻り値の型と一致しません。つまり、多型またはテンプレートの特殊化が必要です。 – AndyG
Andy - はい - それで私はループを閉じることができません。コードスニペットは機能しません。これは、私が何をしたいのかを示すためのものです。そして、あなたは正しいです、そのトリックはどういうわけか、getLookupInfoの戻り値の型を毎回別の型に戻すようにしています。私はバーチャルを望んでいないので、私はテンプレートの専門を使用したいと思います。しかし、IMHOでも厄介です。私の質問の要点は、おそらく:どのように私はテンプレートの専門化を使用してgetLookupInfoを書くのですか? – Frank
トリックはすべてを型に変えることです...どのようにして呼び出すかの疑似コードを私に与えると助けになるかもしれません。 – AndyG