我有一个模板函数,它返回一个数据向量。现在我尝试将它与std :: complex一起使用,但我需要一个明确的模板特化版本。
#include <vector>
#include <complex>
template<typename T>
std::vector<T> FillData(unsigned int n)
{
std::vector<T> v;
return v;
}
template<>
std::vector<std::complex<double>> FillData(unsigned int n)
{
std::vector<std::complex<double>> v;
return v;
}
int main(int argc, char* argv[])
{
auto v1 = FillData<float>(10);
auto v2 = FillData<int>(10);
auto v3 = FillData<std::complex<double>>(10);
auto v4 = FillData<std::complex<float>>(10); // call the one not expected
}
我的问题是,如何使用不同类型的std :: complex专门化模板?我是否需要为每种类型提供一个明确的专业化?
提前致谢。
答案 0 :(得分:1)
转发到您可以部分专业化的课程:
template <typename T>
struct FillDataHelper
{
std::vector<T> operator () () const { return {}; }
};
template <typename T>
struct FillDataHelper<std::complex<T>>
{
std::vector<std::complex<T>> operator () () const { return {}; }
};
template<typename T>
std::vector<T> FillData(unsigned int n)
{
return FillDataHelper<T>{}();
}
答案 1 :(得分:1)
传递你想用值填充的矢量模型,然后让 RVO as-if规则将它返回给你,几乎没有开销。
如果根据T需要不同的行为,现在可以重载FillData函数。
#include <vector>
#include <complex>
template<typename T>
std::vector<T> FillData(std::vector<T> v, unsigned int n)
{
v.reserve(n);
for(int i = 0 ; i < n ; ++n)
{
// for example
v.push_back(0);
}
return v;
}
template<typename T>
std::vector<std::complex<T>> FillData(std::vector<std::complex<T>> v, unsigned int n)
{
v.reserve(n);
for(int i = 0 ; i < n ; ++n)
{
// for example
v.push_back(std::complex<T>(1, 0));
}
return v;
}
int main(int argc, char* argv[])
{
auto v1 = FillData(std::vector<float>(), 10);
auto v2 = FillData(std::vector<int>(), 10);
auto v3 = FillData(std::vector<std::complex<double>>(), 10);
auto v4 = FillData(std::vector<std::complex<float>>(), 10);
}