我有以下功能:
void func1(int8_t input);
void func1(int16_t input);
void func1(int32_t input);
void func1(float input);
除了一些符合输入类型(int8_t
,int16_t
,int32_t
或float
的内部值外,这四个函数的实现是相同的。 )。
目前我正在通过复制粘贴创建其他三个功能,但这非常繁琐。
有没有办法让我只编写1个函数(例如func1(int8_t input);
),而在构建时,其他三个函数是自动创建的?
或者这可以在不需要其他三个功能的情况下工作?任何其他解决方案都很受欢迎。
答案 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
}