C++ 为什么可以';t函数是否可以按返回类型重载?

C++ 为什么可以';t函数是否可以按返回类型重载?,c++,types,return,overloading,C++,Types,Return,Overloading,可能的重复项: 因为我有一个库,它以以下形式公开了一系列函数: bool GetVal(); double GetVal(); int GetVal(); long GetVal(); //So on. 现在我得把这些包起来。我不想再重写同一组函数。我想做点像 template<class T> T GetVal(){} 模板 T GetVal(){} 但我似乎无法让它工作。有什么想法吗?你可以试试 template T GetVal(T){…}(使用虚拟变量执行解析) 使

可能的重复项:

因为我有一个库,它以以下形式公开了一系列函数:

bool GetVal();
double GetVal();
int GetVal();
long GetVal();
//So on.
现在我得把这些包起来。我不想再重写同一组函数。我想做点像

template<class T>
T GetVal(){}
模板
T GetVal(){}
但我似乎无法让它工作。有什么想法吗?

你可以试试

  • template T GetVal(T){…}
    (使用虚拟变量执行解析)
  • 使用类型转换

  • 或只使用简单的<代码> GETVABOOL 等

    < P> C++中只有一个函数可以被返回类型重载,隐式转换运算符特殊函数,名为“代码>运算符T-())/>代码(带有<代码> t>代码>变化).

    您不能重载返回类型,因为在函数调用表达式中使用函数的返回值不是强制性的

    例如,我可以说

    GetVal();
    

    编译器现在做什么?

    函数的返回类型不是编译器为唯一标识每个函数而生成的损坏名称的一部分。以下各项:

    • 参数数
    • 参数类型
    • 论元序列

    是用于为每个函数生成唯一损坏名称的参数。正是基于这些独特的损坏名称,即使名称相同,编译器也可以理解调用哪个函数(重载)。

    不,不能基于返回类型重载

    根据标准文件第13.1.2节

    -不能重载仅在返回类型上不同的函数声明。


    关于你的函数库,每个函数可能属于不同的名称空间,否则它也不可能。

    除了上面的链接,还有其他一些你说你有一个函数库,它已经通过返回类型重载了?听起来unlikely@jalf:我猜函数在不同的名称空间中。@Als:可能吧。或者他们实际上有不同的名字。我们不知道,但目前的问题是,他有一个库,它已经做了他说他做不到的事情(这是不可能的),然后在这个前提下,他尝试做一些完全不同的事情,这可以通过模板专门化来实现(映射一个泛型
    GetVal()
    根据
    T
    的类型,可以使用不同的实现
    template T GetVal()
    template T GetVal()之间没有区别
    ,问题是第一个不起作用。当然,如果能知道为什么nakiya相信这一点,那就好了,但不要问1。不是太有用了。@ephemient:再看看——他传递了一个伪参数,让重载起作用。编译器可能只会发出一个“不明确的返回类型”这是不够的,这是不够的。@马克.兰索姆:请注意这里的差异。请参阅StruouStruts中的“C++编程LanguaGuy第三版”7.4.1:假设我们定义了<代码>浮动GETVAL()/<代码> >代码>双GETVAL()/<代码>,并写<代码> int x= GETValk()现在怎么办?
    float
    double
    可能会隐式转换为
    int
    。我认为一件事是语言根本不允许它,另一件事是为什么不允许。“编译器现在做什么?”-它可能会发出错误,这是一件好事,因为不使用它可能是一个逻辑错误(或明确忽略)结果。至于Karl的“现在做什么?”——完全相同的推理也可以应用于参数重载:
    void f(double);void f(float);f(10);
    “现在做什么?”这不是过载的前提,它必须是无歧义的。-此外,如果您查看链接的问题,可以在C++中模拟返回类型的重载。我猜这种说法的更一般的形式是:“调用函数的结果是否取决于它从哪里调用?”这似乎是一个危险的原则。如果我调用函数
    F(x)
    ,无论我是谁,从何处调用,以及我计划如何处理结果,结果都应该是相同的。即使返回类型用于名称损坏,如果函数调用的返回值被丢弃,也无法确定要调用的确切函数。确切地说,名称损坏不会影响返回类型的计数是一个结果,而不是一个原因。如果标准说这是可能的,那么名称就会包括返回类型。@Chubsdad,mAlters:同意,观点正确!