Rem*_*emy 2 c++ templates typename c++11
我的类SimRank有两个浮点常量参数,C和D.我希望它们是静态constexprs,而不是const实例成员.但我也希望让用户选择哪一种使用浮点,float对尺寸或double精密.
显而易见的方法是这样的:
template<typename FP, int _K, FP _C, FP _D>
class SimRank {
static constexpr int K = _K;
static constexpr FP C = _C;
static constexpr FP D = _D;
};
template<int _K, float _C, float _D>
class SimRank<float> {};
template<int _K, double _C, double _D>
class SimRank<double> {};
int main() {
SimRank<5, 0.8, 0> sd; // uses double
SimRank<10, 0.6f, 0.05f> sf; // uses float
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试这个时,gcc会打印许多错误消息,所以显然语法不存在.我也做不了这样的事情:
template<typename FP> template<int _K, FP _C, FP _D> class SimRank {...};
Run Code Online (Sandbox Code Playgroud)
是否有任何语法可以让我在编译时指定K,C,D以及C和D的类型?现在我已经选择了const成员:
template<typename FP>
class SimRank {
private:
const int K;
const FP C;
const FP D;
public:
SimRank(int K, FP C, FP D) : K(K), C(C), D(D) {}
};
class SimRankF : public SimRank<float> {
public:
SimRankF(int K, float C, float D) : SimRank<float>(K, C, D) {}
};
class SimRankD : public SimRank<double> {
public:
SimRankD(int K, double C, double D) : SimRank<double>(K, C, D) {}
};
int main() {
SimRankD sd(5, 0.8, 0.0);
SimRankF sf(10, 0.6f, 0.05f);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
(实际上,即使我必须保留const成员解决方案,我想要一种方法来定义SimRankF和SimRankD而不重复每个的构造函数.error: no matching function for call to 'SimRankF::SimRankF(int, float, float)'当我尝试实例化SimRankF时,将其删除会使gcc打印.)
有两个问题,
首先,模板非类型参数不能是float或double类型.
其次,部分特化声明的语法(及其在main中的使用)是错误的.
它与C++ 11,BTW无关.
阅读有关C++模板的介绍性文本是最适合您的方法.
| 归档时间: |
|
| 查看次数: |
141 次 |
| 最近记录: |