如何编写C ++模板函数以在内部调用多个C函数?

时间:2016-10-17 15:04:55

标签: c++ c templates overloading

我希望编写一个C ++模板函数,该函数反过来使用一些“C”函数并利用函数重载。

例如,我需要使用模板编写函数myAbs,这些模板根据输入参数类型对fabs中定义的absmath.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”。

4 个答案:

答案 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{};
    }
}

on wandbox

答案 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);
}

如果你想要过度工程化,你可以使用标签发送来减少重复,并在标签选择中弥补。