• 2309d的几个问题


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

    void func(int) {}
    alias FuncType = typeof(func);
    pragma(msg, FuncType); //空(整型)
    alias FuncPtrType = FuncType*;
    pragma(msg, FuncPtrType); //空函数(整数)
    static assert(is(FuncPtrType == typeof(&func)));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    下个:

    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); }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    错误:"splitter!((a,b)=>a.splitter(b).array)'模板实例与模板声明不匹配

    假设你要实例化分割器,并取结果函数的地址,以便splitter_ptr将成为函数指针或闭包.
    你传递编译时参数是完全错误的.应该带:
    1,检查元素和分隔符等价性的函数.
    2,一个keepSeparators标志.
    3,要传入的区间类型,本例中为.
    4,分隔符类型,本例中为chardchar.

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

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

    auto splitter_ptr = (string str, dchar sep) => str.splitter(sep).array;
    
    • 1

    也许这就是你最初尝试的.这里不需要,因为(在此使用的)λ已是函数指针(或闭包).

    import std.stdio;
    import std.process: environment;
    void main () {
       int* ext(string) = &environment.get("PATHEXT");
       writeln(*ext);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    问题是"PATHEXT"是个运行时参数.如果确实想取该运行时参数函数指针,则可用λ:

    import std.stdio;
    import std.process: environment;
    void main () {
        alias atGet = {return environment.get("PATHEXT");}; //真懒
        writeln(atGet);         //`λ`指针
        writeln((*atGet)());    //调用`λ`
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    可能还有其他方法,但不太习惯(使用结构+opCall,又名"函子")
    更进一步,要使用语法正确代码

    alias Ext_T = string (const char[] a, string b); //定义函数类型
    alias Ext_PT = Ext_T*; //定义函数*指针*类型
    Ext_PT ext = &environment.get;
    
    • 1
    • 2
    • 3

    但,禁止捕捉参数.此外,且仅按AliasDeclaration别名声明的右边使用.

  • 相关阅读:
    python基础知识点
    基于nodejs+vue食力派网上订餐系统
    自学Python 49 正则表达式(一)基本语法表达
    White Paper 4Understanding Electrical Overstress - EOS-1
    【5】openGL使用宏和函数进行错误检测
    git强制更新(覆盖)本地仓库与远程仓库一致
    时间序列(四):单变量时间序列的神经网(LSTM)
    ttkefu客服系统的优势及应用领域
    gin索引 btree索引 gist索引比较
    超有品的React项目实战:小米有品组件开发
  • 原文地址:https://blog.csdn.net/fqbqrr/article/details/132722906