在D语言中如何将自动类型变量传递给函数?

8

这在D盘中不起作用。

void doSomething(auto a, auto b){
    // ...
}

我只是好奇,这个方法是否有效?还是说这个方法在技术上根本不可能实现?(或者只是很愚蠢的想法?)

无论如何,有没有其他的方法可以实现这个目标?我想我可以使用...并查看参数列表,但我正在为懒惰的新手人群创建一个库,希望他们能够轻松地创建函数而不必关心数据类型。我正在考虑创建一个名为var的结构体,例如:

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;
}

但我已经开始感到头疼了。而且,我觉得可能有些东西我还不了解。我也很清楚这可能是模板该做的事情...确实是吗?从我所知道的少量信息来看,一个模板应该是这样的(?)
void doSomething(T, U)( T a, U b){
   // ...
}

但现在它看起来不那么清晰了。也许我把一切都搞反了。也许我的困惑源于我认为auto是一种动态类型,类似于JavaScript中的var,但实际上,它是其他什么东西?

如果它不是动态类型,这可能是另一个完全不同的话题,是否有可能创建一个动态类型?或者甚至有一个开源库可用吗?也许是一个liblazy?

(PS. 是的,也许懒惰的开发人员就是我: )


谢谢大家!之前不知道 Variant!好的,我理解 Variant 对于 D 来说有点“离经叛道”。 - 0scar
4个回答

12
如果doSomething是针对任何类型的ab的通用函数,那么使用模板版本是正确的选择:
void doSomething(T, U)(T a, U b) {
    // etc.
}

编译器将在编译时检测 TU 所表示的类型,并生成适当的代码。

6
我想补充一下,与您提出的运行时类型多态(var结构)接近的内容已经在std.variant模块中实现(仅限D2)。
此外,技术上来说,auto只是一个不起作用的关键字 - 它用于需要类型修饰符但没有类型的情况。如果您没有指定类型,D将从初始化表达式中为您推断类型。例如,以下所有内容都可以正常工作:
auto i = 5;
const j = 5;
static k = 5;

2
停止,不要那样做!我担心如果你早期忽略类型,那么后面理解它们会更加困难,特别是因为D语言不是动态类型语言。我认为即使在动态语言中,类型也很重要。
在D2中,你可以使用std.variant来忽略类型,这会让代码看起来像是动态类型的语言。
关于模板的使用,你是正确的,但auto不是。在D中,你可以在很多情况下使用auto这个关键字,比如返回类型,因为D有一个非常好的类型推断系统。但是对于参数,它并没有提供足够信息来推断类型。
有关std.variant的其他信息: 进一步了解后发现,这仍然比你所期望的要复杂。例如,要将值分配给一个已知类型的变量需要调用方法,而你无法从引用中访问类方法。
int b = a.get!(int);
a.goFish() // Error Variant type doesn't have goFish method

1
也许我的困惑源于我认为auto是一种动态类型,类似于javascript中的var,但实际上它是其他什么东西? auto是一种存储类。事实上,它是默认的存储类;除了“这个有一个存储类”之外,它没有任何意义。
现在,如果编译器可以明确推断出类型,那么一切都很好。否则,就会出错:
auto i = 42;  // An integer literal is inferred to be of type 'int'.
auto j;       // Error!

所以auto根本不是一种类型。请记住,所有这些都必须在编译时而不是运行时发生。那么让我们看一个函数:

auto add(auto a, auto b)
{
    return a + b;
}

编译器能否自动推断abreturn值的类型?不行。除了与加法运算符一起使用的基本类型(如intbytedouble等),用户定义的类型可能会重载它,等等。由于编译器无法明确推断出任何这些类型,因此会出现错误。必须在参数中指定类型,因为通常情况下无法推断类型(例如,与声明不同)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接