ポインタをデータメンバに(明示的に)特殊化するnullary staticテンプレートメンバ関数を定義したいと思います。戻り値の型。データメンバへのポインタに特化したテンプレートメンバ関数
各属性についての詳細情報が返されるはずですので、このメソッドをtrait
と呼びます。返されるtraitオブジェクト型は他のテンプレートによって検査されるので、コンパイル時にこの機械全体を利用できるようにする必要があります。
class Foo{
// some data members
int a; std::string b; int c;
// how to declare generic template here?
// compile-time error should ensue if none of the specializations below is matched
// specialization for a (aTraitExpr is expanded from macro, so it is OK to repeat it)
template auto trait<&Foo::a>()->decltype(aTraitExpr){ return aTraitExpr; }
// specialization for b; the return type will be different than for trait<&Foo::a>
template auto trait<&Foo::b>()->decltype(bTraitExpr){ return bTraitExpr; }
};
// some code which queries the trait at compile-time
// e.g. supposing all possible trait types declare isSerializable
// which happens to be True for a and False for b
Foo* foo;
template<bool isSerializable> void doSerialization(...);
template void doSerialization<true>(...){ ... };
template void doSerialization<false>(...){ /* no-op */ };
doSerialization<Foo::trait<&Foo::a>()::isSerializable>(...); // -> doSerialization<true>(foo)
doSerialization<Foo::trait<&Foo::b>()::isSerializable>(...); // -> doSerialization<False>(...)
doSerialization<Foo::trait<&Foo::c>()::isSerializable>(...); // -> compile error, specialization Foo::trait<&Foo::c> not defined
はこれを実現する方法についていくつかのヒントを得ることができる:
は、これまでのところ私は(もちろん壊れたコード、)このようなものがありますか? (私は新しいシリアライゼーションシステムを発明しようとしているわけではなく、既にboost :: serializationを使用しています;それぞれの特性にもっと多くの情報がありますが、これはコンパイル時に必要な例です)。
編集:私が望むものに近づくことができました。at ideone.comと表示されています。私はtrait<Foo::a>()
(現在は)をあきらめていますので、コンパイル時に部分的に固定されている(例えばFoo::TraitType_a::flags
が動作するように)変更可能な型の特性への参照を返す静的関数getTrait_a()
があります。答えがみんなのおかげで、残念ながら私は答えの一つを "答え"として選ぶことができます。
として使用可能であるどの
'と私は抽出する必要があります:。。ここでは可能性がありますそこからのコンパイル時params。申し訳ありませんが、私はその質問をあまり複雑にしたくありませんでした。 – eudoxos