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

How to do string formatting in BetterC mode?

我想使用 Atila Neves 的“概念”包之类的东西。

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

现在我遇到了 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;
    }();
}

TypeInfonot available 与 BetterC。

有一个 bc-string 配音包提供了一个有限的字符串格式化程序,可以在 BetterC 中使用。