zoukankan      html  css  js  c++  java
  • 艾伟:如何实现用返回值重载 狼人:

    今天[ IceSharK - PP.Poet ]很清纯地提出了一个问题,如何能做到函数返回值重载?简单的说,就是如何实现

    string Test() {...}
    int Test() {...}

    然后通过接受方的上下文自动选取重载:

    int i = Test();
    string s = Test();


    当然VB或者C#都是不允许这样写的。不过IL并没有禁止这一写法,事实上在VB或C#中有一种语法结构允许按照返回值选取相应的重载,那就是隐式类型转换运算符(implicit operator或者Widening Operator CType)。通过辅助类的隐式类型转换运算符,我们可以实现上述要求的语法。

    class Foo
    {
        string TestString()
        {
            return "I'm a string";
        }

        int TestInt()
        {
            return 100;
        }

        public TestHelper Test()
        {
            return new TestHelper(this);
        }

        public struct TestHelper
        {
            Foo m_host;
            public TestHelper(Foo host)
            {
                m_host = host;
            }

            public static implicit operator int(TestHelper helper)
            {
                return helper.m_host.TestInt();
            }

            public static implicit operator string(TestHelper helper)
            {
                return helper.m_host.TestString();
            }
        }
    }
    调用的语法非常之完美:

    Foo f = new Foo();
    int i = f.Test();
    string s = f.Test();

    怎么样,并没有使用很高深的语法,就实现了想要的东西。

  • 相关阅读:
    刷题柱 -- 暂封
    模板重搭建計劃
    思路与好题记录与小技巧
    错误记录
    随便记点东西……
    图床
    杂碎的小技巧
    hnsdfz -- 6.21 -- day7
    hsdf -- 6.21 -- day6
    hnsdfz -- 6.20 -- day5
  • 原文地址:https://www.cnblogs.com/waw/p/2156869.html
Copyright © 2011-2022 走看看