如何在BetterC模式下进行字符串格式化



我想使用类似于;概念;Atila Neves的包裹。

我自己以一种简单天真的方式实现了对对象与类型签名的检查。我可以对照我在编译时评估的委托块中定义的接口来检查struct对象,以使它们与BetterC一起工作。我只使用enums的编译时函数求值,它接收已执行的委托代码块的返回值。

现在我遇到了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中工作的有限字符串格式化程序。

相关内容

  • 没有找到相关文章

最新更新