如何在D语言BetterC模式下使用字符串格式化功能?
问题根因
你遇到的报错和使用逻辑无关,根源是std.format的实现本身包含运行时依赖TypeInfo的分支,而BetterC模式会全局禁用所有依赖运行时TypeInfo的函数,哪怕你只在编译期CTFE场景调用这些函数也会被拦截。官方文档的描述没有问题:BetterC确实不会限制纯编译期特性,你对TypeInfo的使用预期也没错——编译期使用TypeInfo本身是完全合法的,问题出在std.format的实现没有做CTFE场景和运行时场景的拆分,导致整个函数被BetterC的检查规则拦下。
兼容BetterC的解决方案
你完全不需要依赖std.format做编译期字符串拼接,直接用D原生的编译期字符串拼接语法就能实现同样的效果,修改后的代码可以完全兼容BetterC,也能保留令牌字符串的语法高亮特性:
template implementsType(alias symbol, type) if (isAbstractClass!type) { enum implementsType = mixin(implementsTypeExpr); enum implementsTypeExpr = { auto result = ""; static foreach(memberName; __traits(allMembers, type)) { // 直接用编译期字符串拼接替代format,无任何运行时依赖 result ~= q{__traits(compiles, __traits(getMember, symbol, "} ~ memberName ~ q{")) && } ~ q{covariantSignature!(__traits(getMember, symbol, "} ~ memberName ~ q{"), __traits(getMember, type, "} ~ memberName ~ q{")) && }; } return (result.length >= 3)? result[0 .. $-3] : result; }(); }
内容的提问来源于stack exchange,提问作者ChrisoLosoph
相关产品推荐
相关产品推荐

