2
__traits(allMembers, T)
은 인스턴스와 정적 멤버를 반환합니다. 정적 멤버를 필터링하려면 어떻게합니까? 필드와 메소드 모두에서이 기능을 사용하고 싶습니다.유형의 모든 비 정적 멤버를 얻는 방법은 무엇입니까?
__traits(allMembers, T)
은 인스턴스와 정적 멤버를 반환합니다. 정적 멤버를 필터링하려면 어떻게합니까? 필드와 메소드 모두에서이 기능을 사용하고 싶습니다.유형의 모든 비 정적 멤버를 얻는 방법은 무엇입니까?
물론 가능합니다. D의 반성 전원이 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