我试图使用以下代码从类中获取整数数据成员的列表:
import std.stdio;
import std.traits;
class D
{
static string[] integralMembers = getIntegralMembers();
static string[] getIntegralMembers()
{
auto allMembers = __traits(allMembers, D);
string[] tmp = new string[allMembers.length];
int ct = 0;
for(int i = 0; i != allMembers.length; ++i) {
bool isInteg = __traits(isIntegral, __traits(getMember, D, allMembers[i]));
if(isInteg) {
tmp[ct++] = allMembers[i];
}
}
string[] ret = new string[ct];
for(int i = 0; i != ct; ++i) {
ret[i] = tmp[i];
}
return ret;
}
int a;
this() { } …Run Code Online (Sandbox Code Playgroud) 我可以import在编译期间连接读取的文件,如下所示:
enum string a = import("a.txt");
enum string b = import("b.txt");
enum string result = a ~ b;
Run Code Online (Sandbox Code Playgroud)
result如果我在数组中有文件名,我怎么能得到连接?
enum files = ["a.txt", "b.txt"];
string result;
foreach (f; files) {
result ~= import(f);
}
Run Code Online (Sandbox Code Playgroud)
此代码返回错误Error: variable f cannot be read at compile time.
功能方法似乎也不起作用:
enum files = ["a.txt", "b.txt"];
enum result = reduce!((a, b) => a ~ import(b))("", files);
Run Code Online (Sandbox Code Playgroud)
它返回相同的错误: Error: variable b cannot be read at compile time
我听说D可以在编译时执行任意用户代码.这是真的?有人可以给出一个例子(特别是当编译永远不会终止时)?这个功能是为了什么?另外,如果是这样的话有一种方法可以通过一些编译器选项来禁用它(编译器是dmd)?
我想懒洋洋地评估函数.由于计算返回值很昂贵,我必须使用memoization,特别是对于被调用的子函数,否则计算的时间复杂度会呈指数级爆炸.我需要在编译时得到结果.(我正在编写一个库,根据提供的字符串提供各种编译时模板.)简而言之,我需要在编译期间进行memoization.
std.functional.memoize不起作用CT,所以这是不可能的.DMD和LDC不够聪明,不能记住纯函数,至少这是我对简单纯函数的实验结果:我测试它是否缓存结果:
使用简单的参数:
int sumN(int n) pure {
int result = 0;
for (int i = 0; i<=n; i++) result += i;
return result;
}
void main() {
enum sumMany = sumN(2000000);
enum sumMany2 = sumN(2000000);
writeln(sumMany, " ", sumMany2);
}
Run Code Online (Sandbox Code Playgroud)
使用模板参数:
int sumN(int n)() pure {
int result = 0;
for (int i = 0; i<=n; i++) result += i;
return result;
}
void main() {
enum sumMany = sumN!2000000;
enum sumMany2 = sumN!2000000;
writeln(sumMany, " ", sumMany2); …Run Code Online (Sandbox Code Playgroud) 我想在编译时加入文件名和图像格式.以下示例不起作用,因为string[]无法在编译时评估我想...
immutable imageFormats = ["bmp", "jpg", "gif", "png"];
template fileNamesWithImageFormat(string[] fileNames)
{
string[] fileNamesWithImageFormat() {
string[] ret;
ret.length = imageFormats.length * fileNames.length;
for (int j = 0; j < fileNames.length) {
for (int i = 0; i < imageFormats.length; ++i) {
ret[j * fileNames.length + i] = fileNames[j] ~ "." ~ imageFormats[i];
}
}
return ret;
}
}
Run Code Online (Sandbox Code Playgroud)
它失败并显示错误消息:
Error: arithmetic/string type expected for value-parameter, not string[]
Run Code Online (Sandbox Code Playgroud)
我需要最终加入import().如何解决错误?
ctfe ×6
d ×6
arrays ×1
dmd ×1
glsl ×1
memoization ×1
mixins ×1
opencl ×1
string ×1
type-traits ×1