我正在創建一個包含數值數據向量(可以是int,float,double等)的模板類。它有一個操作,它在數據上調用std::abs()
。像下面的代碼。帶模板參數或類型名稱的模板函數
#include <iostream>
#include <complex>
#include <vector>
template<typename T> class MyData
{
public:
std::vector<T> data;
MyData<T> my_abs() const;
};
template<typename T>
MyData<T> MyData<T>::my_abs() const
{
MyData<T> output;
output.data.reserve(data.size());
typename std::vector<T>::const_iterator it;
for (it = data.begin(); it != data.end(); it++)
{
output.data.push_back(std::abs(*it));
}
return output;
}
int main()
{
MyData<double> A;
A.data = std::vector<double>(10, -1.0);
MyData<double> test = A.my_abs();
for (auto el : test.data)
{
std::cout << el << std::endl;
}
return 0;
}
這對於int,float,double等類型正常工作。我也希望能夠使用這個類的類型,如std::complex<double>
。
環顧四周,我發現我可以使用模板模板參數:
template<template<typename> class T, typename U> class MyData
{
public:
std::vector<T<U>> data;
MyData<U> my_abs() const;
};
template<template<typename> class T, typename U>
MyData<U> MyData<T<U>>::my_abs() const
{
MyData<U> output;
output.data.reserve(data.size());
typename std::vector<T<U>>::const_iterator it;
for (it = data.begin(); it != data.end(); it++)
{
output.data.push_back(std::abs(*it));
}
return output;
}
前面的代碼不爲我的模板類的工作需要兩個參數,
error: wrong number of template arguments (1, should be 2)
MyData<U> abs() const;
^
理想情況下,我想是這樣之前的代碼。其中my_abs()
函數返回傳遞給我的模板的模板參數的類型。 E.g如果我使用一個std::complex<double>
那麼我的主要功能可能看起來是這樣的:
int main()
{
MyData<std::complex<double>> A;
A.data = std::vector<std::complex<double>>(10, std::complex<double>(-1.0, -1.0));
MyData<double> test = A.my_abs();
for (auto el : test.data)
{
std::cout << el << std::endl;
}
return 0;
}
我不知道如何可以做到這一點(或者甚至可以使用相同的模板類)。
只需專注您的第一個版本,一類像'的std ::複雜'也許。 –