可以使用itk::NumericTraits来获取某种类型的0和1。因此,我们可以在野外看到这种代码:

const PixelType ZERO = itk::NumericTraits<PixelType>::Zero;
const PixelType ONE = itk::NumericTraits<PixelType>::One;

这感觉沉重且难以阅读。作为程序员,我希望使用更实用的版本,例如:
const PixelType ZERO = 0;
const PixelType ONE = 1;

但这完全等效吗?我认为强制转换是在编译期间完成的,因此两个版本的速度应该相同。如果是这样,为什么有人要使用itk::NumericTraits来获取0和1?我一定看不到优势。

最佳答案

特性通常在通用编程的上下文中使用/有用。它在STL中使用率很高。

让我们考虑一下NumericTraits如下所示:

template <typename PixelT>
struct NumericTraits {
  static const int  ZERO = 0;
  static const int  ONE = 1;
};

除此之外,您还应该或也可以将模板实例限制为一种特定类型。.使用enable_if等。

现在,有一种特殊的特殊像素类型,您将如何为它定义ZEROONE?只要专门化您的NumericTraits
template <>
struct NumericTraits<SpecialPixel>{
  static const int ZERO = 10;
  static const int ONE = 20;
};

有想法和有用吗?现在,这的另一个好处是将值转换为类型,然后将其用于标记分派(dispatch):
void func(int some_val, std::true_type) {....}
void func(int some_val, std::false_type) {.....}

And call it like:

func(42, typename std::conditional<NumericTraits<PixelType>::ONE == 1, std::true_type, std::false_type>::type());

在编译时确定要调用的重载,从而可能会提高性能,从而使您不必再进行if - else检查,从而避免了:

关于c++ - 数字特征零和一,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37705316/

10-10 08:39