在 C++ 中进行“constify”操作有意义吗?

2024-01-04

有一个“constify” 操作于C/C++这使得一个变量const?

这是一个它可能有用的示例,显然我们不想声明它const但在第一行:

std::vector<int> v;
v.push_back(5);
constify v; // now it's const

目前,如果没有这种可能性,您必须引入另一个变量才能获得相同的效果:

std::vector<int> v0;
v0.push_back(5);
const std::vector<int>& v = v0;

这更令人困惑,因为它在范围中添加了一个新名称,并且您需要将其作为引用以避免复制整个向量(或使用swap?).


说实话我找到了less如果变量是其中之一,则令人困惑const或者不,比这是否可以改变。


详细说明一下:您通常想要这样做的原因是因为您无法初始化const以您想要的方式变量。std::vector就是一个很好的例子。好吧,这一次,下一个标准引入了通用初始化语法,使这成为可能:

const std::vector<int> cvi = { 1, 2, 3, 4, 5, 42 }; 

然而,即使手头没有 C++1x 的东西,甚至使用不允许此初始化语法的类型,您始终可以创建一个辅助函数来执行您想要的操作:

const std::vector<int>& cvi = create_my_vector();

或者,如果你想变得更奇特:

const std::vector<int>& cvi = compile_time_list<1,2,3,4,5,42>::create_vector();

请注意&。复制函数调用的结果是没有意义的,因为将右值绑定到const引用会延长其生命周期,直到引用的生命周期结束。
当然,使用支持 C++1x 移动语义的编译器重新编译将使此类优化几乎没有必要。但是将 rvlaue 绑定到const参考可能仍然比移动向量更快并且不太可能慢。
使用 C++1x,您还可以创建 lambda 函数来快速执行此操作。 C++ 提供了极其庞大的工具库。 IME,无论你多么努力地思考,其他人都应该想出另一个想法来做同样的事情。而且往往比你的更好。


然而,无论如何,IME 这个问题通常只是因为函数太少而代码太多。然后它不仅适用于常量,还适用于类似的特征 - 比如引用所指的内容。
一个经典的方法是使用多个可能的流之一。而不是这个

int main(int argc, char* argv[])
{
  std::istream* istrm = NULL;
  std::ifstream ifs;
  if( argc > 1 )
  {
    ifs.open( argv[1] );
    if( ifs.good() ) 
      istrm = &ifs;
  }
  if( !istrm ) 
    istrm = &std::cin;

  while( istrm->good() )
  {
     // reading from *istrm implemented here
  }
  return 0;
}

只需将关注点分为 1)弄清楚从哪里读​​取和 2)实际读取:

int read(std::istream& is)
{
  while( is.good() )
  {
     // reading from is implemented here
  }
  return 0;
}

int main(int argc, char* argv[])
{
  if( argc > 1 )
  {
    std::ifstream ifs( argv[1] );
    if( ifs.good() ) 
      return read(ifs);
  }
  return read(std::cin);
}

我还没有看到一个现实世界中的变量的例子,它不像它应该的那样恒定,并且无法通过分离关注点来修复。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C++ 中进行“constify”操作有意义吗? 的相关文章

随机推荐