【问题标题】:Proper casting for fstream read and write member functionsfstream 读写成员函数的正确转换
【发布时间】:2011-06-08 01:31:02
【问题描述】:

虽然关于 reinterpret_cast 的主题写了很多行,而且它有多糟糕,但我仍然对避免它的最佳方法感到困惑,尤其是在处理像从 fstream 读取和写入这样的函数时。所以,这是我的困境......

假设我们有一个整数数组,我们想用文件中的一些数据来填充它。

std::ifstream iFile( ... );

// presume that the type of this array is not a matter of choice
int *a = new int[ 100 ]; 

我们可以用几个不同的演员来阅读:

iFile.read( (char *)a, sizeof( int ) * 100 );
iFile.read( reinterpret_cast< char * >( a ), sizeof( int ) * 100 );
iFile.read( static_cast< char * >( static_cast< void * >( ( a ) ), sizeof( int ) * 100 );

第一个(C 风格)已经过时,我们在 C++ 中引入了新的风格转换,这是有充分理由的。第二个是不可移植的,不提供任何保证。第三个写起来很乏味,破坏了乐趣。

有什么替代方法吗?我应该怎么做?

编辑:

我们的目标是实现代码的可移植性和尽可能符合标准。

【问题讨论】:

  • 第三个是智障。我不明白为什么你不能使用 reinterpret_cast。但是,您所说的“不可移植且不提供任何保证”到底是什么意思?您指的是字节顺序,以及未来可能对 int 大小的更改吗?
  • 虽然从技术上讲,reinterpret_cast 的行为无法得到保证,但这种情况正是您应该使用的。大多数实现在 C 风格转换和 reinterpret_cast 之间几乎没有区别。
  • 可能没有定义 reinterpret_cast 的行为。但是规范还说对于那些知道底层机器的寻址结构的人来说并不奇怪所以假设你知道你的机器(标准PC)它应该可以工作很好。
  • @PigBen 我指的是在这种特殊情况下 reinterpret_cast 的未定义行为。我并没有推断出任何具体的实现。这就是为什么我首先提出这个问题。 @Daniel 我同意这是一个最吸引人的解决方案,并且我同意它会按预期运行(在大多数平台上)。这更像是一个理论问题。
  • @Vedran :我已经编辑了我的帖子。我想你会喜欢的。它是便携式的。 :-)

标签: c++ fstream reinterpret-cast


【解决方案1】:

为什么不将a 声明为char*,如下所示:

//int *a = new int[100]; 
char *a = new char[100];
iFile.read(a, 100 ); 

现在不需要强制转换。


编辑:

好的,我阅读了您的评论和您帖子中的评论行。在这种情况下:

iFile.read(reinterpret_cast<char*>(a), sizeof(int)*100);

应该够了。

不过,我个人会选择 C ​​风格的演员表:

iFile.read((char*)a, sizeof(int)*100);

那是因为我在这里没有看到任何危险。即使使用 C-Style 演员,一切似乎都很好!


最好但不那么乏味的演员表

定义这个函数模板:

template<class To, class From>
To any_cast(From v)
{
    return static_cast<To>(static_cast<void*>(v));
}

然后使用它:

//`From` type will be inferred from the function argument. :-) 
iFile.read(any_cast<char*>(a), sizeof(int)*100);

看起来不错?

我认为这个any_cast 可以用来从任意类型转换为任意类型!

【讨论】:

  • 假设我没有选择。该行上方的评论一定跳过了你。
  • 您不能将 int* 静态转换为 char*。
  • 感谢您的努力。尽管您的解决方案使用了自定义代码(这意味着我需要在任何地方都包含它),但它为我的困境提供了最好和最优雅的解决方案。 :)
  • "我认为这里没有任何危险。" “危险”是这种 C 风格的转换可能会抛弃 constness。
  • @curiousguy:那reinterpret_cast 呢?它可以抛弃 const-ness 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-09
  • 1970-01-01
  • 2011-12-29
  • 2021-06-11
相关资源
最近更新 更多