我认为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/