要从函数类型
取函数指针类型
,可在末尾添加*
:
cpp
void func(int) {}
alias FuncType = typeof(func);
pragma(msg, FuncType); //空(整型)
alias FuncPtrType = FuncType*;
pragma(msg, FuncPtrType); //空函数(整数)
static assert(is(FuncPtrType == typeof(&func)));
下个:
cpp
void main()
{
import std.stdio:writeln;
import std.algorithm.iteration : splitter;
auto splitter_ptr = &splitter!((a, b) => a.splitter(b).array);
string str = "TEST1;TEST2;TEST3";
auto words = splitter_ptr(str, ';');
foreach (word; words) { writeln(word); }
}
错误:"splitter!((a,b)=>a.splitter(b).array)'
模板实例与模板
声明不匹配
假设你要实例化
分割器,并取结果函数
的地址,以便splitter_ptr
将成为函数指针或闭包
.
你传递编译时
参数是完全错误
的.应该带:
1,检查元素和分隔符
间等价性
的函数.
2,一个keepSeparators
标志.
3,要传入
的区间类型,本例中为串
.
4,分隔符
类型,本例中为char
或dchar
.
可在文档
中找到这些内容.你不小心想按编译时
参数传递给分割器
.
试实例化
像分割器这样复杂
的模板函数而不调用
,不是很实用.它不是为此
而设计的.我宁愿
定义一个包装调用
它的函数
,如(未经测试,可能有错误):
cpp
auto splitter_ptr = (string str, dchar sep) => str.splitter(sep).array;
也许这就是你最初
尝试的.这里
不需要,因为(在此使用的)λ
已是函数指针(或闭包)
.
cpp
import std.stdio;
import std.process: environment;
void main () {
int* ext(string) = &environment.get("PATHEXT");
writeln(*ext);
}
问题是"PATHEXT"
是个运行时参数
.如果确实想取该运行时参数
的函数指针
,则可用λ
:
cpp
import std.stdio;
import std.process: environment;
void main () {
alias atGet = {return environment.get("PATHEXT");}; //真懒
writeln(atGet); //`λ`指针
writeln((*atGet)()); //调用`λ`
}
可能还有其他方法,但不太习惯(使用结构+opCall
,又名"函子")
更进一步,要使用语法
的正确代码
是
cpp
alias Ext_T = string (const char[] a, string b); //定义函数类型
alias Ext_PT = Ext_T*; //定义函数*指针*类型
Ext_PT ext = &environment.get;
但,禁止
捕捉参数.此外,且仅按AliasDeclaration
别名声明的右边
使用.