【发布时间】:2016-07-13 06:58:47
【问题描述】:
是否可以只为类的特定模板实例声明成员函数?这就是我想要这样做的原因:
// Polynomial<N> is a polynomial of degree N
template<int N>
class Polynomial {
public:
//... various shared methods e.g...
double eval(double x) const;
Polynomial<N-1> derivative() const;
Polynomial<N+1> integralFrom(double x0) const;
// ... various shared operators etc.
double zero() const; // only want Polynomial<1> to support this
// only want Polynomial<2> and Polynomial<1> to support the following
// because the solutions rapidly become too difficult to implement
std::vector<double> zeros() const;
std::vector<double> stationaryPoints() const { return derivative().zeros();}
private:
std::array<double,2> coeffs;
}
我目前的解决方法是从Polynomial<N>::zeros() 为N>2 抛出一个异常,但在编译时检测到问题会很好。
【问题讨论】:
-
模板专业化是否适合您?
-
如果 C++11 可用,您可以使用
static_assert(N <= 2, "Incorrect template argument.")代替throw。它可以防止编译时出现不需要的功能。 -
无论如何你都需要专业化(由于
Polynomial<N-1>) -
@DieterLücking 是的。
Polynomial<0>::derivative不能定义为我的示例中声明的。但是怎么做呢?如何从一些模板实例中省略一些成员函数?我可以声明它们但不定义它们吗? -
这是基本的,一个专门的类是一个完全不同的类,你可以在实例化之前不知道模板的情况下使用任何模板。