2309d的几个问题

要从函数类型函数指针类型,可在末尾添加*:

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,分隔符类型,本例中为chardchar.

可在文档中找到这些内容.你不小心想按编译时参数传递给分割器.

实例化像分割器这样复杂的模板函数而不调用,不是很实用.它不是为此而设计的.我宁愿定义一个包装调用它的函数,如(未经测试,可能有错误):

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别名声明的右边使用.

相关推荐
fqbqrr3 个月前
2407d,D2024三月会议
d
fqbqrr6 个月前
2403d,d的com哪里错了
d
fqbqrr8 个月前
2402d,d的变参
d
fqbqrr8 个月前
2401d,ddip1027如何支持sql
d
fqbqrr8 个月前
2401d,讨论d串滑动参数
d
fqbqrr9 个月前
2312d,D语言单元测试等
d
fqbqrr9 个月前
2312d,d语言作为胶水,用C++调用rust
c++·rust·d
fqbqrr9 个月前
2312d,把alloca注入调用者域
d
fqbqrr9 个月前
2312d,d语言来绑定C++和rust
c++·rust·d
fqbqrr10 个月前
2311ddip1000不能从函数返回域引用
d