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

  • 相关阅读:
    【云原生之kubernetes】在kubernetes集群下的映射外部服务—Eendpoint
    开源大数据集群部署(十二)Ranger 集成 hive
    MySQL高级SQL语句
    辛普森一家,有趣的句子
    【Linux】权限
    Java中的基本容器知识你真的了解过吗?
    解决java.io.IOException: Broken pipe的报错
    9大项目管理问题,PM请务必掌握!
    Java集合——Set接口
    面试字节、美团、阿里等公司后,才知道软件测试面试题就这些...
  • 原文地址:https://blog.csdn.net/fqbqrr/article/details/132722906