使用类型特征的部分类特化

Chr*_*ebe 4 c++ templates sfinae template-specialization c++17

我对 C++ 很陌生,我遇到了一个我似乎无法解决的问题,也无法找到其他有同样问题的人。

我有一个Polynomial定义的类:

template<class C>
class Polynomial {
    std::vector<C> coefficients;
    ...
public:
    ...
    const double integral(double, double);
    ...
};
Run Code Online (Sandbox Code Playgroud)

我需要确保,integral()如果C是整数类型,则无法调用该方法。显然,这意味着使用类型特征,但是我已经尝试template<typename = typename std::enable_if<!std::is_integral<C>::value, C>::type>在方法本身上使用,尽管它可以编译,但我现在无法使用整数类型作为模板参数创建对象。

然后我想,应该可以创建Polynomial类的部分特化,即具有浮点的类的特化,一个是整数,一个是复数。类似的东西

template<typename C>
class Polynomial<typename std::enable_if<std::is_floating_point<C>::value, C>::type> : Polynomial<C> {
public:
    const double integral(double, double);
};
Run Code Online (Sandbox Code Playgroud)

然而,不管我怎么做,它似乎永远不会奏效。

我想我的问题是:如何使用类型特征作为特化来指定类的部分特化?

我希望你能帮忙。

kri*_*isz 6

你需要一个单独的基类来处理常见的东西,然后你可以Polynomial像这样制作模板特化:

template<class C>
class PolynomialBase {
    std::vector<C> coefficients;
};    

template <typename T, typename Enable = void>
class Polynomial;

template<typename C>
class Polynomial<C, typename std::enable_if<!std::is_integral<C>::value>::type> : PolynomialBase<C> {
public:
     const double integral(double, double);
};    

template<typename C>
class Polynomial<C, typename std::enable_if<std::is_integral<C>::value>::type> : PolynomialBase<C> {};
Run Code Online (Sandbox Code Playgroud)