【问题标题】:How to do string formatting in BetterC mode?如何在 BetterC 模式下进行字符串格式化?
【发布时间】:2021-09-21 01:21:01
【问题描述】:

我想使用类似 Atila Neves 的“Concepts”包。

我自己以一种简单的方式实现了针对类型签名的对象检查。我可以对照我在编译时评估的委托块中定义的接口检查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;
    }();
}

【问题讨论】:

    标签: d


    【解决方案1】:

    TypeInfonot available 与 BetterC。

    有一个bc-string dub 包提供了一个有限的字符串格式化程序,可以在 BetterC 中工作。

    【讨论】:

    • 现在很高兴知道为什么TypeInfo 在 CTFE 中不可用,因为文档说 BetterC 的 CTFE 功能不受限制。
    猜你喜欢
    • 2020-02-02
    • 1970-01-01
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多