だから私はこれが可能なのかどうかはわかりません。コンパイル時にマップを静的にチェックしていますか?
とにかく、静的なconstマップ(または類似のもの)をコンパイル時にチェックして、一致する値(この場合はid)があることを確認しようとしています。具体的には、私は現在、このような悪いことがあります(コンパイルはしません):
template<typename T>
struct TypeMapChecker
{
static const std::map<std::type_info, MessageID> type_map;
static const bool contains = (type_map.count(typeid(T)) > 0);
}
template<typename T>
const std::map<std::type_info, MessageID> TypeMapChecker<T>::type_map = {
{ typeid(ClassA), MESSAGE_A_ID },
{ typeid(ClassB), MESSAGE_B_ID }
};
..........
template<typename T0, typename T1>
class MessagePair
{
static const bool t0Has = TypeMapChecker<T0>::contains;
static const bool t1Has = TypeMapChecker<T1>::contains;
static_assert (t0Has && t1Has, "I'M ASSERTING MY AUTHORITY, YOU MALIGNANT CODERS");
}
そういうものです。
static const bool contains = (type_map.count(typeid(T)) > 0);
はちょうど私がMessagePairでtype_mapにアクセスしたとき、私はビルド時に値を保証しています、とに依存する必要がないことを検証する:で、「定数式を期待」ので、これはビルドされません。これは多くの人が修正した大きなコードベースです(実行時に悪いことをしないようにすることはできません)。他の実装や助けがあれば幸いです。ありがとう。
マップではできませんが、コンパイル時のコンテナとメンバーシップのクエリが必要な場合は、タイプリストを使用できます。 http://loki-lib.sourceforge.net/html/a00681.html – imreal
@imrealリストはタイプがリストにあるかどうかを調べるだけです。ちょうど一見で、私はメンテナンスの悪夢になることなく、私が帰りIDをつかむことができるとは思わない。 – mascoj
が正しいのですが、型の型を使用して型のIDを取得できます。 – imreal