【发布时间】:2019-08-08 11:44:59
【问题描述】:
我想在某些情况下使用std::pow(来自cmath)的实现,而在其他情况下,我想使用myspace::pow。
namespace myspace
{
template <typename T>
T pow(T val, unsigned exp)
{
if (exp == 0) return 1;
return val*pow(val,exp-1);
}
}
不同的情况由模板参数决定。
template <typename T>
void myFunction()
{
auto val = pow(2.1,3);
/* ... */
}
如果T == double,我希望val 与std::pow 一起计算。如果T == mydouble,我希望val 与myspace::pow 一起计算。现在,我有很多行如auto val = pow(2.1,3);,我想避免为每一行代码检查T 的类型。
struct mydouble { /* ... */ };
myFunction<double>(); // uses std::pow
myFunction<mydouble>(); // uses myspace::pow
我一直在为此烦恼,但找不到解决方案。有什么建议吗?
【问题讨论】:
-
您可以使用 constexpr if 和 std::is_same
::value 检查 T 的类型。 -
@nada 好的,我必须编辑问题才能更清楚。我想避免检查每个命令的类型。
-
正常函数重载有什么问题?只需将您的
pow写为mydouble pow(mydouble val, unsigned exp) ...(在mydouble所在的同一个命名空间中执行此操作),一切都会正常工作。 -
你知道ADL(argumentdependent lookup)吗?
标签: c++ templates namespaces