2
__traits(allMembers, T)
は、インスタンスメンバーと静的メンバーの両方を返します。どのようにして静的メンバーをフィルタリングできますか?私はフィールドとメソッドの両方で動作するようにしたいと思います。タイプのすべての非静的メンバーを取得するにはどうすればよいですか?
__traits(allMembers, T)
は、インスタンスメンバーと静的メンバーの両方を返します。どのようにして静的メンバーをフィルタリングできますか?私はフィールドとメソッドの両方で動作するようにしたいと思います。タイプのすべての非静的メンバーを取得するにはどうすればよいですか?
確かにこれを行うことができます。 D'sのイントロスペクション電力がstd.meta
からあなたのケースFilterには、計り知れない;-)あなたの友達です
struct Lion
{
static maxSpeed = 100;
string name;
bool isDangerous()
{
return true;
}
static bool isAlive(uint meat)
{
return meat > 100;
}
}
template FilterMembers(alias T, bool filterStatic = true)
{
import std.meta : Filter;
template filter(string member)
{
enum memberStr = T.stringof ~ "." ~ member;
enum isStatic = __traits(isStaticFunction, mixin(memberStr)) ||
__traits(compiles, mixin("{auto b = " ~ memberStr ~ ";}"));
enum filter = filterStatic^isStatic;
}
enum FilterMembers = Filter!(filter, __traits(allMembers, T));
}
unittest
{
import std.meta : AliasSeq;
assert(FilterMembers!Lion == AliasSeq!("name", "isDangerous"));
assert(FilterMembers!(Lion, false) == AliasSeq!("maxSpeed", "isAlive"));
}
// or using the old-school main
version(unittest) {} else
void main()
{
import std.stdio;
foreach (member; FilterMembers!Lion)
writeln(member);
}
これは、引数を持つ関数を処理していないが、それは、 '__traits(isStaticFunction)'で扱うことができます。 – rcorre
ああ、ありがとう - 私はそれを更新しました。誰か他の人がこれにぶつかる場合に備えて、 – greenify
ありがとう!私はちょうど[Witchcraft](http://code.dlang.org/packages/witchcraft)を発見しました。これはこれ以上のための良いライブラリソリューションのように見えます。 – rcorre