这在D中不起作用:
void doSomething(auto a, auto b){
// ...
}
Run Code Online (Sandbox Code Playgroud)
我只是好奇,这会不会有用?或者这在技术上是不可能的?(或者只是简单的愚蠢?)
无论如何,这可以通过任何其他方式完成吗?我想我可以使用...并查看参数列表,但我有点为懒惰的新手制作一个库,并希望它们能够轻松地创建函数而无需真正关心数据类型.我正在玩创建一个名为varlike 的结构的想法
struct var{
byte type;
void* data
// ...
}
// and overload like all operators so that a lazy devver can do
var doSomething(var a, var b){
if(a == "hello")
b = 8;
var c = "No.:" ~ b ~ " says:" ~ a;
return c;
}
Run Code Online (Sandbox Code Playgroud)
但我的脑袋已经开始受伤了.而且,我有点觉得我错过了什么.我也痛苦地意识到这可能是模板的用途......是吗?从我知道的一点点,模板看起来像这样(?)
void doSomething(T, U)( T a, U b){
// ...
}
Run Code Online (Sandbox Code Playgroud)
但现在它看起来不那么干净了.也许我已经倒退了所有这些.也许我的困惑源于我的信念,这auto是一种动态类型,可与var我的javascript 相媲美,但实际上,它还有其他什么?
如果它不是动态类型,这可能是另一个主题,是否可以创建一个?或者甚至可能有一个开源库?也许是liblazy?
(PS.是的,也许这个懒惰的人就是我:)
JSB*_*ոգչ 12
如果doSomething是在任何类型的通用a和b,然后模板版本是做正确的事:
void doSomething(T, U)(T a, U b) {
// etc.
}
Run Code Online (Sandbox Code Playgroud)
编译器将检测由所表示的类型T和U在编译时和产生合适的代码.
我只想补充一点,关于运行时类型多态性(var结构)的想法已经在std.variant模块中实现(仅限D2).
此外,从技术上讲,auto它实际上是一个什么都不做的关键字 - 它用于需要没有类型的类型修饰符的地方.如果未指定类型,D将从初始化表达式中为您推断出它.例如,所有这些工作:
auto i = 5;
const j = 5;
static k = 5;
Run Code Online (Sandbox Code Playgroud)