C ++中优雅的函数定义

时间:2016-05-27 08:26:01

标签: c++ function macros

我有以下功能:

void func1(int8_t input);
void func1(int16_t input);
void func1(int32_t input);
void func1(float input);

除了一些符合输入类型(int8_tint16_tint32_tfloat的内部值外,这四个函数的实现是相同的。 )。

目前我正在通过复制粘贴创建其他三个功能,但这非常繁琐。

有没有办法让我只编写1个函数(例如func1(int8_t input);),而在构建时,其他三个函数是自动创建的?

或者这可以在不需要其他三个功能的情况下工作?任何其他解决方案都很受欢迎。

5 个答案:

答案 0 :(得分:5)

使用模板功能是解决此问题的方法:

template <typename T>
void func1(const T value)
{
   //   Do some stuff
}

如果你需要使用特殊的内部值,这取决于输入类型,你可以使用这样的辅助类型特征:

template <typename T>
struct SomeTrait
{
   static const int value = 10;
};

template <>
struct SomeTrait<float>
{
   static const int value = 20;
};

template <typename T>
void func1(const T value)
{
   std::cout << SomeTrait<T>::value << std::endl;
   //   Do some stuff
}

答案 1 :(得分:3)

这显然需要模板功能。这将需要C ++ 11

#include <type_traits>

template <typename T
          // This constrains the template function instantiation to only
          // integral and floating types
          typename = typename std::enable_if<std::is_integral<T>::value
                                             ||
                                             std::is_floating_point<T>::value>::type>
void func1(T input)
{
  ......
  T tmp; // Use the same data type inside function
}

如果你想保持简单,没有C ++ 11,那就做吧

template <typename T>
void func1(T input)
{
  ......
  T tmp; // Use the same data type inside function
}

缺点是您不能仅将此函数模板的实例化约束为整数和浮点类型。您可以使用boost :: enable_if和其他类型特征代替&#39; std :: enable_if&#39;但在这种情况下,std :: type_traits。

答案 2 :(得分:1)

您可以将其定义为模板功能:

template<typename T> void func1(T input) {
    // ...
}

然后这样称呼:

float f = 1.234;
func1<float>(f);

int32_t i32 = 45678;
func1<int32_t>(i32);

答案 3 :(得分:0)

如果函数的实现相同,您可以使用模板:

template <typename T>
void func1(const T value)
{
   //   Do some stuff
}

如果某些输入类型的实现不同,您可以指定此专业化,例如

void func1(const complex value)
{
   //   Do some stuff related to complex values
}

答案 4 :(得分:0)

执行此操作的最佳方法是使用模板功能。

template <typename T>
void your_function(const T input){

 // do something

}
另一方面,

可以指定模板功能

template <>
void your_function(const float input){


// do some specific things

}