我认为D的static if是有趣的语言功能。这提示了我的问题:是否还有其他编译语言示例,其中的编译器对代码有很强的理解力,并且是否有语言设施可以访问它们?

例如,此代码提供了与Python中的repr类似的内容:

char[] repr(T)(T value) {
  static if (is(typeof(value.__repr__))) { // class T provides a "repr()" method
    return value.__repr__();
  } else static if (is(T:string)) {
    return `"` ~ value ~ `"`;
  // ...other cases...
  } else {
    return toString(value);
  }
}


我认为这很酷,因为与类似的功能相比,它允许对重载所做的操作采用一种不同且更通用的方法,这是一种使代码更具动态性的内而外方式。例如,编译器知道我的类有多少个字段,但是我的代码无法用大多数语言在编译时访问该信息。

卡瓦特:最后一段有意见,但我只是想为我的问题提供一些动机和澄清,而不是引起争议。我只想了解是否有其他编译语言具有此类功能。

最佳答案

任何带有真实宏的语言都具有静态if的形式。例如,Lisp和Nemerle允许您使用'if'和for-loops等编程结构来构建宏扩展为的代码。这些本质上是编译时的决策,使您可以执行类似于static if的操作。对于Nemerle,宏基本上是编译器的插件,在编译时执行。

在C ++中,有一个boost MPL库,其中有一个kind of static if可用于在两种类型之间进行选择。您可以在run()成员中的两种类型中放入一些代码,并获得类似的内容,但是语法非常繁琐。

例如,使用Boost MPL,您可以执行以下操作:

struct float_impl {
    static void run() { /* float case code */ }
}
struct int_impl {
    static void run() { /* int case code */ }
}

typedef typename if_<
          is_same<T, float>
        , float_impl
        , int_impl
        >::type impl_t;
impl_t::run();


在D中将是:

static if(is(T == float)) {
     /* float code */
}
else {
     /* int code */
}

关于static - 除了D以外,还有其他带有静态if的语言吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1717976/

10-12 00:13
查看更多