C++ 扩展c++;非基本类型的数学函数

C++ 扩展c++;非基本类型的数学函数,c++,math,overloading,C++,Math,Overloading,我想延长吗?或者重载?(不太确定如何调用)double和其他基本类型使用的sqrt()函数,以便我自己的类可以使用它。这里称为“myType”。当函数sqrt()的参数为myType时,我将为其编写代码。我希望sqrt()在用于基本类型时保持不变。这样我就可以编写一个涵盖这两种情况的模板 比如说。下面的关键是能够对Basic和myType使用bar()。myType不是foo(),基本类型是bar()。这能干净利落吗?提前感谢您的帮助 #include <math.h> using

我想延长吗?或者重载?(不太确定如何调用)double和其他基本类型使用的sqrt()函数,以便我自己的类可以使用它。这里称为“myType”。当函数sqrt()的参数为myType时,我将为其编写代码。我希望sqrt()在用于基本类型时保持不变。这样我就可以编写一个涵盖这两种情况的模板

比如说。下面的关键是能够对Basic和myType使用bar()。myType不是foo(),基本类型是bar()。这能干净利落吗?提前感谢您的帮助

#include <math.h>

using namespace std;

class myType
{
public:
    myType() {
    }
    double sqrt()
    {
        return  4;//just to return something
    }
};

template<typename T> bool bar(T in)
{
    if (sqrt(in) == 4) {// handels int and all sorts of other types but not my type
        return true;
    }
    return false;
}

template<typename T> bool foo(T in)
{
    if (in.sqrt() == 4) { //handles myType
        return true;
    }
    return false;
}

int main() {
    double y = 3;
    bar(y);//This is great

    myType x;
    //bar(x);//this is the line I want to write
    foo(x);//stuck doing this
}
#包括
使用名称空间std;
类myType
{
公众:
myType(){
}
双sqrt()
{
return 4;//只是为了返回一些东西
}
};
模板栏(T英寸)
{
if(sqrt(in)==4){//handels int和各种其他类型,但不是我的类型
返回true;
}
返回false;
}
模板布尔富(T英寸)
{
如果(in.sqrt()==4){//处理myType
返回true;
}
返回false;
}
int main(){
双y=3;
棒(y);//这太棒了
myx型;
//bar(x);//这是我想写的一行
foo(x);//坚持这样做
}

我认为您无法让
std::sqrt
使用您的用户定义类型(除非可以使用转换运算符将它们转换为基本数据类型)。但是您可以编写自己的函数,在默认情况下重定向到
std::sqrt
,并为用户定义的类型专门化它。然后在代码中使用该函数,而不是
std::sqrt

首先,有一种依赖于参数的查找(ADL,也称为könig查找),它在函数的参数名称空间中搜索函数
foo()
。因此,如果在名称空间
my
中定义类,则可以在该名称空间中定义函数
sqrt()
,即使在非限定上下文中调用,也会自动找到该函数

其次,为了使模板函数通用,需要启用ADL。但是,如果将其用于基本类型,它仍然不会查看命名空间
std
。因此,给编译器一个提示,
std::sqrt
可以在函数中使用

示例(草图):

名称空间我的{
结构编号;
数量sqrt(数量常数&);
}
模板
标量
sym_sqrt(标量常数和s){
使用std::sqrt;
如果(s<0){
返回-sqrt(-s);
其他的
返回sqrt;
}
int main(){
浮动m=。。。;

出于好奇,我检查了编辑内容。@Toby,我不知道你的编辑内容占了答案的很大一部分。非常感谢!
namespace my {
    struct number;
    number sqrt(number const&);
}

template<typename scalar>
scalar
sym_sqrt(scalar const& s) {
    using std::sqrt;
    if (s < 0) {
        return -sqrt(-s);
    else
        return sqrt(s);
}

int main() {
    float m = ...;
    std::cout << sym_sqrt(m);

    my::number n = ...;
    std::cout << sym_sqrt(n);
}