c++ - C++11 模板中的一个参数可以依赖于另一个吗?

标签 c++ templates c++11 typename

我的类 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/

相关文章:

python - 如何让 offsetof() 成为私有(private)类成员?

c++ - 为什么 "n"在此函数中没有递增?

c++ - OpenCV 检测变暗的矩形

c++ - 使用 std::random_device 和 pRNG 有什么区别,例如std::mt19937 和没有?

c++ - std::declval<void>() 是一个有效的表达式吗?

c++ - 有没有办法(在 C++ 中)创建一个实现某些功能的模板类?

c++ - typedef decltype 函数指针未返回正确的输出(cout)

c++ - qt/c++ 应用程序中的实时问题

c++ - 如何引用模板类中定义的typedef

C++ 通用指针函数或模板