std :: complex <t>的显式模板特化

时间:2017-09-15 21:01:57

标签: c++ template-specialization

我有一个模板函数,它返回一个数据向量。现在我尝试将它与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专门化模板?我是否需要为每种类型提供一个明确的专业化?

提前致谢。

2 个答案:

答案 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);
}