通过自动输入的变量在D中运行?

0sc*_*car 8 d dynamic-data

这在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是在任何类型的通用ab,然后模板版本是做正确的事:

void doSomething(T, U)(T a, U b) {
    // etc.
}
Run Code Online (Sandbox Code Playgroud)

编译器将检测由所表示的类型TU在编译时和产生合适的代码.


Vla*_*eev 6

我只想补充一点,关于运行时类型多态性(var结构)的想法已经在std.variant模块中实现(仅限D2).

此外,从技术上讲,auto它实际上是一个什么都不做的关键字 - 它用于需要没有类型的类型修饰符的地方.如果未指定类型,D将从初始化表达式中为您推断出它.例如,所有这些工作:

auto i = 5;
const j = 5;
static k = 5;
Run Code Online (Sandbox Code Playgroud)