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