管理我自己的存档系统,我有以下虚函数:
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_t
是unsigned long int
,但在Windows 64位上使用intel,std::size_t
是unsigned 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。
答案 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()
和有符号整数类型。)