我想使用类似于;概念;Atila Neves的包裹。
我自己以一种简单天真的方式实现了对对象与类型签名的检查。我可以对照我在编译时评估的委托块中定义的接口来检查struct
对象,以使它们与BetterC一起工作。我只使用enum
s的编译时函数求值,它接收已执行的委托代码块的返回值。
现在我遇到了std.format.format
的问题,它使用TypeInfo作为%s
格式化程序,在BetterC中编译时会出现错误。对于代码生成,我希望使用令牌字符串,因为它们具有语法高亮显示功能。但正确使用它们需要字符串插值或字符串格式化。core.stdc.stdio.snprintf
不能替代,因为CTFE只能解释D源代码。
从技术上讲,这不是问题。我可以将标记字符串转换为所见即所得字符串。
但我想知道为什么我不能使用它。官方文档说,BetterC的编译时功能是不受限制的(我认为这包括TypeInfo)。要么这是明显的错误,要么我做错了。
template implementsType(alias symbol, type)
if (isAbstractClass!type)
{
enum implementsType = mixin(implementsTypeExpr);
enum implementsTypeExpr =
{
import std.format : format;
auto result = "";
static foreach(memberName; __traits(allMembers, type))
{
result ~= format(
q{__traits(compiles, __traits(getMember, symbol, "%1$s")) && }~
q{covariantSignature!(__traits(getMember, symbol, "%1$s"), __traits(getMember, type, "%1$s")) && }
, memberName);
}
return (result.length >= 3)? result[0 .. $-3] : result;
}();
}
TypeInfo
不适用于BetterC。
有一个bc字符串配音包,它提供了一个在BetterC中工作的有限字符串格式化程序。