代码之家  ›  专栏  ›  技术社区  ›  Jonathan Mee

按返回类型重载模板

  •  2
  • Jonathan Mee  · 技术社区  · 9 年前

    Mooing Duck 发表评论 here “一个函数不能返回多个类型。但是,您可以专门化或委托重载,这很好。”

    我开始思考这一点,我试图弄清楚,这部法律法规是怎样的:

    template <typename T>
    T initialize(){ return T(13); }
    

    当调用时:

    auto foo = initialize<int>();
    auto bar = initialize<float>();
    

    这不就转化为仅由返回类型重载的两个同名函数吗?

    2 回复  |  直到 7 年前
        1
  •  6
  •   Nathan Monteleone    9 年前

    这不是一种过载,而是一种专门化。它们是不同的机制(事实上,将两者混合在一起会导致混淆,因为重载是在考虑专业化之前解决的——例如,请参见Sutter的Mill文章: http://www.gotw.ca/publications/mill17.htm ).

        2
  •  6
  •   Pradhan    9 年前

    下面是不允许的仅返回值重载的示例:

    int initialize();
    float initialize();
    

    OTOH,给定主模板定义

    template <typename T>
    T initialize(){ return T(13);}
    

    引用自 here

    为了编译函数调用,编译器必须首先执行名称查找,对于函数,这可能涉及依赖于参数的查找,而对于函数模板,后面可能是模板参数推导。如果这些步骤产生多个候选函数,则执行重载解析以选择实际调用的函数。

    initialize<int> initialize<float> 只是所述模板的两个不同的实例。它们是两个不同的功能,不属于同一个潜在过载解决候选列表的一部分。