2014-10-07 79 views
1

我正在玩一些D代码。 我有一些功能的阵列上筛选:如何在D lang中声明一个指向模板函数的指针?

auto Case1Filters(R)(R lines) if(isInputRange!R) { ... } 
auto Case2Filters(R)(R lines) if(isInputRange!R) { ... } 

我想有一个函数指针,并分配给它我的过滤器之一,因此,我宣布一个像这样的变量:

auto function(R)(R lines) filter = null; 

我编译时得到这些错误:

conv.d(54): Error: basic type expected, not function 
conv.d(54): Error: function declaration without return type. (Note that constructors are always named 'this') 
conv.d(54): Error: no identifier for declarator int function(R)(R lines) 
conv.d(54): Error: semicolon expected following function declaration 

它看起来像编译器认为我声明了一个函数。 我尝试了一个别名,但无济于事:有没有办法做到这一点?

回答

2

您不能有任何类型的动态分派给模板,出于同样的原因你不能有虚拟模板功能。

尽管所有外观D是静态类型语言,这意味着所有函数指针声明必须具有所有可用类型(包括返回类型auto只能在包含正文时使用)。

所以如果R已经被声明,那么你可以这样做:

auto foo(R)(){//R is defined here as some type 

    Ret function(R lines) filter = null;//no template param when declaring the function pointer and concrete return type 

    filter = &Case1Filters!R; 

    filter(r); 

} 
+0

它确实:-)解决这个问题,尽管我期待的是,编译器会已经能够推断返回类型,两者的功能存在并返回一个字符串数组。 – garph0 2014-10-10 05:30:28

+0

但函数可以被赋予第三个不相关的函数,它具有相同的签名但返回类型不同 – 2014-10-10 06:58:08

+0

它可以,但它不会:我的期望是,如果编译器发现两个不匹配的函数,它会窒息(有点像在这种情况下:http://pastebin.com/8Tf5TdPQ)但也许我只是想念一些东西:我对这门语言非常陌生。 – garph0 2014-10-10 08:08:12