带有非泛型参数的C ++ Template Specialization

时间:2018-01-24 21:29:49

标签: c++ templates generics

当我有多个参数并且其中一些是非泛型

时,我对模板特化有所了解

我有一个叫做Polinom(多项式)的类,它基本上是一个T对象数组,其大小在模板定义中声明(作为int)。我还有一个名为Complex的类。现在我想要的是创建一个模板专门化,这样当我有一个复杂为T的polinomial时,我将调用不同的函数(重载的运算符函数)。我的问题是我怎么能这样做,我收到一个错误"类型名称不允许,stepen undefined"在尝试创建专业化时,如果有人能够清理这里发生的事情会很棒。

  #pragma once
#include <iostream>
#include <cmath>

using namespace std;

template<class T, int stepen>
class Polinom
{
private:
    T koeficijenti[stepen];
public:
    Polinom() {};
    ~Polinom() {};
    void ucitajKoef();
    T vrednost(T x);
};

template<>
class Polinom<Complex, int stepen> //error type name not allowed
{

};

template<class T, int stepen>
T Polinom<T, stepen>::vrednost(T x)
{
    T suma = koeficijenti[1] * (T)pow(x, stepen);
    for (int i = 1; i < stepen; i++)
    {
        suma += koeficijenti[i] * pow(x, stepen - i);
    }
    return suma;
}

template<class T, int stepen>
void Polinom<T, stepen>::ucitajKoef()
{
    T uneseniKoef;
    for (int i = 0; i < stepen; i++)
    {
        cout << "Unesite koeficijent" << endl;
        cin >> uneseniKoef;
        koeficijenti[i] = uneseniKoef;
    }
}

P.S。是否有一个解决方法,必须重写该类的所有其他函数,因为我只专注,所以我可以重载函数vrednost(值)

1 个答案:

答案 0 :(得分:0)

专业化应该如下:

#include <iostream>

template <typename T, int N>
struct Array {
    T var[N];
    T sum() { 
        T res{};
        for (T v:var) {
            res += v;
        }
        return res;
    }
};

struct Complex {};

template <int N>
struct Array<Complex, N> {
    Complex var[N];
    Complex sum() {
        std::cout <<"Complex sum called\n";
        return {};
    }
};


int main()
{
    Array<Complex,5> array;
    array.sum();
}

请注意,这是一个最小的(我认为),完整且可验证的示例。如果你在提出问题时花时间创造类似的东西,你会得到更好的答案。

回答你的问题:我知道没有办法简单地专门化模板中的一个函数 - 这就是为什么你会得到复杂的东西,比如CRTP和从成员调用的各个函数(可以单独专门化)