データメンバーへのポインタに(明示的に)特化され、特殊化ごとに異なる戻り型を持つことができるnullary静的テンプレートメンバー関数を定義したいと思います。
各属性に関する詳細情報が返されるはずなので、このメソッドを呼び出します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を使用しています。各特性にはより多くの情報があります。これは、コンパイル時に必要になる理由の単なる例です)。
編集:私は私が欲しいものに近い何かを得ることができました、それはideone.comで示されています。trait<Foo::a>()
私は(今のところ)持っていることをあきらめたのでgetTrait_a()
、変更可能な型特性への参照を返す静的関数がありますが、コンパイル時に部分的に修正されます(たとえば、それはFoo::TraitType_a::flags
機能します)。返信してくださった皆様のおかげで、残念ながら「答え」としては1つしか選べません。