可以使用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等。
现在,有一种特殊的特殊像素类型,您将如何为它定义
ZERO
和ONE
?只要专门化您的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/