用于自定义和标准类型的数学函数的统一接口
Posted
技术标签:
【中文标题】用于自定义和标准类型的数学函数的统一接口【英文标题】:Uniform Interface for Math functions for custom and standard type 【发布时间】:2017-11-16 00:29:43 【问题描述】:我在namespace a
中有一些自定义类型a::Vector
,为此我定义了一些数学函数a::abs
、a::pow
和a::isnan
等。我希望能够调用abs(T t)
而不必担心参数T
是double
还是a::Vector
。在任何地方只使用abs
正确使用a::abs
为a::Vector
使用ADL,但默认使用C
样式abs(int t)
函数,即使是double
参数,而我希望它使用std::abs
或fabs
.
我不想使用using std::abs
声明,因为这通常被认为是不好的。我有哪些选择可以为所有不同类型提供统一的界面abs(T t)
?
【问题讨论】:
嗯,这可能是using std::abs;
可能并非不合理的一个用例。真正糟糕的是使用“using namespace std;”来拉动整个套件和 kaboodle。或者,您也可以定义一个名称相似的模板函数,例如 Abs()
,然后将其专门用于您的向量,然后将其专用于 double
,作为真正函数的包装器。
这也是我目前唯一想出的答案,但我不确定我是否遗漏了什么。我将等待几天,然后使用 using std::abs 指令,因为我假设没有其他头文件会触及它,因此它应该保持保留。
【参考方案1】:
如果template<class T> abs(T x)
在std
中定义,那么您可以专门化该模板,但std::abs
没有这样的通用模板。向namespace std
添加重载是未定义的行为。 https://***.com/a/14403772
我会推荐using std::abs;
。 using
具体功能一般没有问题;只有using namespace
不好。
【讨论】:
只是一个注释,定义是重载abs函数,这不是标准未定义,不能重载std中的函数吗? @JayeshBadwaik 你是对的,不允许重载。看起来std::abs
也没有合适的模板,所以你不能像使用交换那样通过模板专业化来解决这个问题(在***.com/a/14403772 中描述)。我会相应地编辑我的答案。以上是关于用于自定义和标准类型的数学函数的统一接口的主要内容,如果未能解决你的问题,请参考以下文章