gpt4 book ai didi

c++ - 静态模板类的建议

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:39:32 29 4
gpt4 key购买 nike

我有这个问题(直方图)。我有一个真实空间:[a,b] 以某种方式分区 ([a0=a, a1, a2, ..., b])。分区可以是等空间(a1 - a0 = a2 - a1 = ...)或变量。

我需要一个类来处理这个问题,用一些方法来说明给定一个值它属于哪个分区的 bin;找到特定 bin 中心的其他方法等等。

在程序中我不喜欢实例化一个类只是为了调用这些简单的函数

Binner binner(binning);
binner.get_bin(1.3);
binner.get_centerbin(2);

所以我尝试使用模板编写一个静态类来做类似的事情:

Binner<binning>::get_bin(1.3);
Binner<binning>::get_centerbin(2);

这是个好主意吗?还有其他方法吗?现在我有像

这样的免费功能
double get_bin(double bin, Binning binning); // a lot of if/else inside

但我认为它太容易出错了。

这里是我的实现:

enum Binning {CELL, LARGE, BE};
const double binning_LARGE[] = {0, 1.2, 1.425, 1.550, 1.800, 2.5};
const double binning_BE[] = {0, 1.425, 1.550, 2.5};

template<Binning binning>
class Binner
{
public:
static const double* bins;
static const int n;
static int get_bin(double value);
};

template<> const double* myclass<LARGE>::bins = binning_LARGE;
template<> const double* myclass<BE>::bins = binning_BE;

template<> const int myclass<LARGE>::n = sizeof(binning_LARGE) / sizeof(double);
template<> const int myclass<BE>::n = sizeof(binning_BE) / sizeof(double);

template<Binning binning> int myclass<binning>::get_bin(double value)
{
return find_if(bins, bins + n,
bind2nd(greater<double>(), value)) - bins - 1;
}

template<> int myclass<CELL>::get_bin(double value)
{
return static_cast<int>(value / 0.025);
}
  1. 它是一个好的实现/设计吗?
  2. 有没有办法使用std::vector 来避免n 字段?怎么样?
  3. 有没有办法参数化 0.025?我知道 double 不能作为模板参数,但我可以写类似这样的东西吗:

    Binner<0.025> binner;
  4. 其他/建议?

编辑:

第三点为什么我做不到:

template<Binning binning, int N=100>
class Binner
{
public:
static const double* bins;
static const int n;
static int bin(double value);
};

...

template<Binning binning, int N> int Binner<CELL, N>::bin(double value)
{
return static_cast<int>(value / (2.5 / N));
}

最佳答案

恕我直言,如果您不想实例化一个类,您的设计就可以了。确实,这似乎是一种 template metaprogramming大部头书。这是否有意义取决于您计划如何重用此模板。

当然,使用 std::vector 可以让您摆脱变量来保存数组大小。现在,如果这对您的设计有好处,我不知道...它会将一些复杂性从您的模板定义中转移到分箱定义(现在您可以非常简单地对其进行初始化)...

最后,您可以实例化您的模板并向其传递常量:

template < Binning binning, unsigned long N, unsigned long M>
class ... {
<using N>
}

关于c++ - 静态模板类的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6744365/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com