【问题标题】:Implementing a C-style sizeof() function in D在 D 中实现 C 风格的 sizeof() 函数
【发布时间】:2016-08-19 00:40:45
【问题描述】:

我想在 D 中实现一个 C 风格的 sizeof() 函数。(我知道 .sizeof 的东西,但它有助于移植很多 C (C99)。)

显然,我希望它能够在编译时运行,并将类型或表达式作为参数。理想情况下,如果可能的话,我希望它具有与 C 相同的语法,而不是使用独特的模板调用语法,因为这会大大增加它的实用性。这有可能吗?

【问题讨论】:

  • size_t sizeof( T )( T x ) { return T.sizeof; } // 是一次糟糕的失败——我的第一次,注定失败的尝试
  • size_t sizeof( T )() { return T.sizeof; } size_t sizeof( T )( T x) { return T.sizeof; } // 就是这样。
  • 顺便说一句,您知道本指南吗? dlang.org/ctod.html
  • 是的,我直接浏览了网站的那个部分。不过,我仍然是一个新手。我目前正在重读 Ali Çehreli 的在线书籍,非常有帮助。遗憾的是这些示例有点啰嗦和不切实际,但是当您需要保持简洁并专注于您打算展示的功能时,您可以在教程中做很多事情。
  • 虽然它仍然是 WIP,但 DLang Tour 也有一些材料可以提供,例如tour.dlang.io/tour/en/gems/…

标签: d sizeof ctfe


【解决方案1】:

如果我对您的理解正确,您想要类似于下面的size 函数的行为吗? size2 将是一个运行时函数,这在 D 中当然有点毫无意义。但是您仍然可以使用enum val = size2(2 + 2); 在 CT 处从 size2 获取值。这对您有帮助吗?

template size(T)
{
    enum size = T.sizeof;
}

// for expressions
template size(alias T)
{
    enum size = T.sizeof;
}

auto size2(T)(T x)
{
    return T.sizeof;
}

void main(string[] args)
{
    import std.stdio : writeln;

    writeln(size!int); // 4
    writeln(size!long); // 8
    writeln(size!(1 + 1)); // 4


    writeln(size2(2));  // 4
    writeln(size2(2L)); // 8
    writeln(size2(2 + 2)); // 4
}

【讨论】:

  • 谢谢。这当然是一个值得的进步。我仍然需要尝试摆脱!调用所需的位置。第二件事是,sizeof 是 D 中的保留字吗?我真的可以简单地调用函数或模板“sizeof”吗?不是必需的,就像在移植 C 时使用 size2( 或任何不太繁重的东西一样进行全局搜索和替换。
  • 我想将其标记为“一个答案”,但我什至不确定是否真的存在我对木棍上月球的愿望的答案。好吧,要成为权威的“没办法”绝对是一个答案。也许我应该简单地贿赂沃尔特·布莱特! :-)
  • 你的函数真的是非编译时函数吗?
  • 等我的手没有那么痛的时候,我会考虑你的好建议。
  • > 第二件事是,sizeof 是 D 中的保留字吗?我真的可以简单地调用函数或模板“sizeof”吗?不,我只是选择了size2 以使其更清晰。
猜你喜欢
  • 1970-01-01
  • 2012-09-14
  • 2016-08-02
  • 2020-10-04
  • 2011-11-20
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-08
相关资源
最近更新 更多