我想要用C++實作一個計算向量2-norm的函數,這個函數會根據向量的型態而有不同的實作:
#include <iostream>
#include <math.h>
#include <complex>
# 實數情況
void norm2(float* a, size_t n, float& res)
{
res = 0;
const float* const a_end = a + n;
while (a < a_end){
res += (*a)*(*a);
++a;
}
res = sqrt(res);
}
# 複數情況
void norm2(std::complex<float>* a, size_t n, float& res)
{
res = 0;
const float* p = (float*) a;
const float* const p_end = p + 2*n;
res=0;
while (p < p_end)
{
res += (*p)*(*p);
++p;
}
res = sqrt(res);
}
如果向量的型態可以是double
, interger
, std::complex<double>
和std::complex<integer>
的話,想請問有沒有什麼方法可以只定義一個廣義函數的介面,然後使用函數時會根據資料型態來決定呼叫哪個實作?
更新:
@yhmtsai 提供的解決辦法-使用function overload 加上 template
#include <iostream>
#include <math.h>
#include <complex>
# 實數情況
template <typename ValueType>
void norm2(ValueType* a, size_t n, ValueType& res)
{
res = 0;
const ValueType* const a_end = a + n;
while (a < a_end){
res += (*a)*(*a);
++a;
}
res = sqrt(res);
}
# 複數情況
template <typename ValueType>
void norm2(std::complex<ValueType>* a, size_t n, ValueType& res)
{
res = 0;
const ValueType* p = (ValueType*) a;
const ValueType* const p_end = p + 2*n;
res=0;
while (p < p_end)
{
res += (*p)*(*p);
++p;
}
res = sqrt(res);
}