如何在 BetterC 模式下进行字符串格式化?
How to do string formatting in BetterC mode?
我想使用 Atila Neves 的“概念”包之类的东西。
我自己以一种简单朴素的方式根据类型签名实现了对象检查。我可以根据我在编译时评估的委托块中定义的接口检查 struct
对象,以使它们与 BetterC 一起工作。我只使用 enum
s 的编译时函数评估,它接收 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;
}();
}
TypeInfo
是 not available 与 BetterC。
有一个 bc-string 配音包提供了一个有限的字符串格式化程序,可以在 BetterC 中使用。
我想使用 Atila Neves 的“概念”包之类的东西。
我自己以一种简单朴素的方式根据类型签名实现了对象检查。我可以根据我在编译时评估的委托块中定义的接口检查 struct
对象,以使它们与 BetterC 一起工作。我只使用 enum
s 的编译时函数评估,它接收 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;
}();
}
TypeInfo
是 not available 与 BetterC。
有一个 bc-string 配音包提供了一个有限的字符串格式化程序,可以在 BetterC 中使用。