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)
然而,不管我怎么做,它似乎永远不会奏效。
我想我的问题是:如何使用类型特征作为特化来指定类的部分特化?
我希望你能帮忙。
你需要一个单独的基类来处理常见的东西,然后你可以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)