草庐IT

c++ - 构建依赖于非 const-correct 库的 const-correct (C++) 库

coder 2023-11-17 原文

我正在用 C++ 构建一个库(主要是为了好玩),我已经研究了一段时间(多年,哈哈,这只是一种爱好)

我最近将一些基础(阅读、库依赖)切换到了另一个库。不幸的是,该库根本不关心“const-correctness”。我有点强制症,我喜欢挑战自己以“正确的方式™”做事,所以我想让我的库 const-correct。我已经开始了几次,有些部分是;我知道最好从一开始就开始 const-correct 但这并不真正相关或值得辩论。事实上,我有兴趣再次认真地尝试它,但另一个图书馆阻止我这样做。

你可能会问,这是怎么回事?

好吧,如果我正在调用一个显然应该是 const 的方法(实际上并没有改变任何东西),并且我的方法也是 const-ing(新词)的候选者,我无法确保我的方法是 const-ness直到另一个方法也是常量。

示例:

// Bad third-party library

struct Foo
{
    void should_be_const() {}
};

// My library

struct Bar
{
    Foo my_foo;
    void should_be_const() const
    {
        my_foo.should_be_const(); // ERROR!  Not a const function!
    }
};

只有根据经验证据以及我对常量性的研究和理解,这对我来说才显而易见。然而,这可能是一种错误形成的理解,所以我对它的错误和其他表现持开放态度(并且充满希望?)(尽管这会动摇我对 const-ness 的理解基础哈哈)

如果他(或她)想要编写一个合适的库但依赖项不是那样写的,那么可怜的人该怎么办?

我希望这是一个适合 SO 的问题。请(我相信你会的)让我知道它是否不是,或者是否有更好的 StackExchange 网站可以发布它。

附言我找到了 this SO question ,但我希望可以详细说明主题/解决方案。

最佳答案

您提到的另一个问题很好地说明了问题所在,但我不同意这个答案。您的子库中的界面将分为四种情况。

  1. 不是 const 的东西,也不能期望是。
  2. 正确声明为 const 的事物
  3. 逻辑上应该是常量的东西,以及

    3a。如此实现但未如此声明

    3b。不是这样实现的

情况 1 很简单 - 如果您希望您的是 const,那么您需要在调用该接口(interface)之前复制输入。 Actor 只是错误的,最终会导致崩溃或其他错误。情况 2 不是问题。所以案例 3 是。

不幸的是,实际情况是案例 3a 和 3b 应该与案例 1 一样对待,因为它们无法区分。实现可能因平台或版本而异。所以,你应该创建一个拷贝,然后调用接口(interface)。注意我说的是“应该”。事实上,我们大多数人会使用 const_cast 来调用我们认为我们理解的接口(interface)(例如 strcmp)。它成为我们对实现的信心程度的判断。就个人而言,我不会担心 strcmp。几乎任何更高级别的东西都可以使用类似 strtok 的东西,它会破坏东西。

关于c++ - 构建依赖于非 const-correct 库的 const-correct (C++) 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24214199/

有关c++ - 构建依赖于非 const-correct 库的 const-correct (C++) 库的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby-on-rails - 在 ruby​​ .gemspec 文件中,如何指定依赖项的多个版本? - 2

    我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这

  3. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  4. ruby - 在 Ruby 中构建长字符串的简洁方法 - 2

    在编写Ruby(客户端脚本)时,我看到了三种构建更长字符串的方法,包括行尾,所有这些对我来说“闻起来”有点难看。有没有更干净、更好的方法?变量递增。ifrender_quote?quote="NowthatthereistheTec-9,acrappyspraygunfromSouthMiami."quote+="ThisgunisadvertisedasthemostpopularguninAmericancrime.Doyoubelievethatshit?"quote+="Itactuallysaysthatinthelittlebookthatcomeswithit:themo

  5. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  6. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  7. ruby - 使用 rbenv 和 ruby​​-build 构建 ruby​​ 失败,出现 undefined symbol : SSLv2_method - 2

    我正在尝试在配备ARMv7处理器的SynologyDS215j上安装ruby​​2.2.4或2.3.0。我用了optware-ng安装gcc、make、openssl、openssl-dev和zlib。我根据README中的说明安装了rbenv(版本1.0.0-19-g29b4da7)和ruby​​-build插件。.这些是随optware-ng安装的软件包及其版本binutils-2.25.1-1gcc-5.3.0-6gconv-modules-2.21-3glibc-opt-2.21-4libc-dev-2.21-1libgmp-6.0.0a-1libmpc-1.0.2-1libm

  8. ruby - 有什么方法可以告诉 sidekiq 一项工作依赖于另一项工作 - 2

    有什么方法可以告诉sidekiq一项工作依赖于另一项工作,并且在后者完成之前无法开始? 最佳答案 仅使用Sidekiq;答案是否定的。正如DickieBoy所建议的那样,您应该能够在依赖作业完成时将其启动。像这样。#app/workers/hard_worker.rbclassHardWorkerincludeSidekiq::Workerdefperform()puts'Doinghardwork'LazyWorker.perform_async()endend#app/workers/lazy_worker.rbclassLaz

  9. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

  10. ruby-on-rails - `const_missing' : uninitialized constant (NameError) - 2

    每次我尝试使用“script/runner-eproductionClassName.run”从我的Rails2.2应用程序的lib目录运行任何类时,我都会收到以下错误:/usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/commands/runner.rb:47:/usr/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/dependencies.rb:89:in`const_missing':uninitializedconstantClassName(NameError)

随机推荐