我希望编写一个C ++模板函数,该函数反过来使用一些“C”函数并利用函数重载。
例如,我需要使用模板编写函数myAbs
,这些模板根据输入参数类型对fabs
中定义的abs
或math.h
进行适当调用。怎么做?
#include <math.h>
template<typename T>
T abs(T x)
{
// I need to write an efficient code here!
// If it is 'double' and 'float' I may be able to compare the
// sizeof(Type) and call 'return fabs(x)' or 'return abs(x)'.
// But this is not a good solution as two types can be of same size!
}
注意:我只是用它作为例子来解释我的问题。我已经知道<cmath>
已经提供了这样一个功能“abs”。
答案 0 :(得分:5)
模板可能不是这里的答案。考虑只是重载:
inline float myAbs(float x) { return fabsf(x); }
inline double myAbs(double x) { return fabs(x); }
答案 1 :(得分:4)
C ++ 17解决方案(主要是为了好玩),它保证在编译时获取分支:
template <typename T>
T my_abs(T x)
{
if constexpr(std::is_same<T, double>{})
{
return std::fabs(x);
}
else if constexpr(std::is_same<T, float>{})
{
return std::abs(x);
}
else
{
// Produces a compiler error:
struct invalid_type;
return invalid_type{};
}
}
答案 2 :(得分:0)
您可以使用C ++ 11类型特征:
#include <math.h>
#include <type_traits>
template<typename T>
T abs(T x)
{
if(std::is_same<T,double>::value)
{
//do double stuff
}
else if(std::is_same<T,float>::value)
{
//do float stuff
}
else
{
//deal with unsupported type
}
}
希望有所帮助。
答案 3 :(得分:0)
您可以明确地专门化功能模板:
template<>
double abs<double>(double x) {
return fabs(x);
}
如果你想要过度工程化,你可以使用标签发送来减少重复,并在标签选择中弥补。