我的类 SimRank 有两个浮点常量参数,C 和 D。我希望它们是静态常量表达式,而不是常量实例成员。但我也想让用户选择要使用的种类 float ,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;
}
但是当我尝试这个时,gcc 会打印出很多错误信息,很明显那个语法不存在。我也不能做这样的事情:
template<typename FP> template<int _K, FP _C, FP _D> class SimRank {...};
是否有任何语法可以让我在编译时指定 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;
}
(实际上,即使我必须保留 const 成员解决方案,我也想要一种定义 SimRankF 和 SimRankD 的方法,而无需为每个重复构造函数。将其排除在外会使 gcc 打印 error: no matching function for call到 'SimRankF::SimRankF(int, float, float)'
当我尝试实例化 SimRankF 时。)
最佳答案
有两个问题,
一、模板非类型参数cannot be of type float or double .
其次,部分特化声明的语法(及其在 main 中的使用)是错误的。
它与 C++11 无关,顺便说一句。
阅读有关 C++ 模板的介绍性文字是最适合您的方式。
关于c++ - C++11 模板中的一个参数可以依赖于另一个吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31195432/