在编译时检测std :: size_t类型以调用正确的函数

时间:2017-09-03 12:33:52

标签: c++ c-preprocessor preprocessor size-t boost-preprocessor

管理我自己的存档系统,我有以下虚函数:

virtual void OutputArchive::save_unsigned_long_int(unsigned long int i);
virtual void OuptutArchive::save_unsigned_long_long_int(unsigned long long int i);
virtual void InputArchive::load_unsigned_long_int(unsigned long int& i);
virtual void InputArchive::load_unsigned_long_long_int(unsigned long long int& i);

然后,出于某种原因,我还必须管理类型std::size_t,这可能因编译器而异。例如,对于Linux 64位上的gcc,std::size_tunsigned long int,但在Windows 64位上使用intel,std::size_tunsigned long long int。在第一种方法中,我写了类似的东西:

void OutputArchive::save_size_t(std::size_t i)
{
  if(boost::is_same<std::size_t,unsigned long int>::value)
    this->save_unsigned_long_int((unsigned long int)i);
  else if(boost::is_same<std::size_t,unsigned long long int>::value)
    this->save_unsigned_long_long_int((unsigned long long int)i);
  else { /* error management */ }
}

但是,我对此并不满意:它很难看,只能执行一行,类型在编译时已知。我想可以通过预处理做得更好,但我不知道如何开始这个。欢迎任何帮助。

注意:出于兼容性原因,我不使用C ++ 11,但我使用Boost。

1 个答案:

答案 0 :(得分:1)

预处理器对类型一无所知。或范围。或任何涉及程序语义的东西。所有预处理器都可以处理令牌,这些令牌只是与一小组词法规则相对应的字符序列。

简而言之,类型在编译时是已知的,但在与预处理器对应的转换阶段期间不是这样。 C ++在编译时使用类型信息来确定适当的重载函数,并推导出正确的模板定义。这些都可能是解决问题的合适方法。

值得注意的是,C ++标准只要求size_t为“无符号整数类型”。它不需要是标准无符号整数类型(参见§3.9.1p1),因此size_t可能既不是unsigned int,也不是unsigned long int也不是unsigned long long int ptrdiff_t。 (类似的注释适用于let shape: SKShapeNode = SKShapeNode(circleOfRadius: 50) shape.name = "shape" shape.lineWidth = 1 // this way we see that this is a circle shape.fillColor = .white // to see the true colors of our image //shape.strokeColor = .white //shape.glowWidth = 0 shape.fillTexture = SKTexture(imageNamed:"myImage") shape.position = CGPoint(x: 0, y:200) self.addChild(shape) let newTexture: SKTexture = (self.view?.texture(from: self.childNode(withName: "shape")!))! let sprite: SKSpriteNode = SKSpriteNode(texture: newTexture) self.addChild(sprite) shape.removeFromParent() 和有符号整数类型。)