保护 CRTP:私有析构函数是唯一的解决方案吗?

2024-02-28

如何避免

template <typename Derived>
struct base { int foo() { return static_cast<Derived*>(this)->bar(); } };

struct derived : base<derived> { int bar(); };        
struct another_derived : base<derived> { int bar(); };  // error: wrong base

派生类中无需额外代码?

这已被问到twice https://stackoverflow.com/questions/28548958/how-to-secure-crtp-against-providing-wrong-superclass before https://stackoverflow.com/questions/4417782/how-to-avoid-errors-while-using-crtp(尽管没有避免在派生类中添加额外代码的额外条件),使用推荐的answer https://stackoverflow.com/a/7240019/1023390

template <typename Derived>
struct base {
  int foo() { return static_cast<Derived*>(this)->bar(); } 
private:
  ~base() {}
  friend Derived;
};

然而,这不仅可以防止上述错误,而且还使得所有私有成员Base可从Derived。有没有替代方案可以避免这种情况?或者是否可以最终证明这是不可能的?


edit

我实际上有一个更复杂的问题,除了通常的用法(如上所述)之外,还有

template<typename Derived>
struct intermediate : base<Derived>
{
  int bar() { return static_cast<Derived*>(this)->ark(); }
};

当私有析构函数技巧失败时(因为intermediate不成为朋友base).


None

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

保护 CRTP:私有析构函数是唯一的解决方案吗? 的相关文章

  • 部署 MVC4 项目时出错:找不到文件或程序集

    过去 我只需使用 Visual Studio 2012 发布到 AWS 菜单项即可部署我的 MVC4 网站 到 AWS Elastic Beanstalk 现在 程序可以在本地编译并运行 但无法部署 从消息来看 它似乎正在寻找不在当前部署的
  • C++:无法使用scoped_allocator_adaptor传播polymorphic_allocator

    我有一个vector
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co

随机推荐

  • php mysqli 准备语句选择

    尝试让一个函数能够为任何表创建带有多个参数的简单 CRUD 选择 我认为我已经完成了最难的部分 但现在无法获取数据 也许我做错了什么我无法弄清楚 我准备好的语句函数 function prepared query mysqli sql pa
  • emacs 不备份 git repo 中的文件

    emacs不创建文件内的备份git存储库 我希望保存它们 因为我经常依靠它们在将更改提交到git repo 我正在使用xemacs直到最近 它总是会创建通常的 第一次保存时的文件 但emacs如果在 a 内工作则不会执行此操作git项目 在
  • 从 jenkins 运行 selenium testNG 时,chrome 不会最大化

    我在跑步时遇到问题 硒测试NG 来自 jenkins 的测试 问题是我正在登录我的应用程序并检查一些元素可见性 当我直接从批处理文件运行测试时 我取得了成功 因为我将我的 google chrome 驱动程序设置为最大化使用 driver
  • 如何使用整理器按属性排序? (爪哇)

    我使用Java 我想使用 Collat or 按属性对对象的子列表进行排序 以便按字母顺序排序但忽略重音符号 问题是我尝试了不同的方法 但没有任何效果 这会对子列表进行排序 但不会忽略重音符号 newList subList 0 5 sor
  • Mapfile 作为 MapReduce 作业的输入

    我最近开始使用 Hadoop 在使用 Mapfile 作为 MapReduce 作业的输入时遇到问题 以下工作代码在 hdfs 中编写一个名为 TestMap 的简单 MapFile 其中包含三个 Text 类型的键和三个 BytesWri
  • Gradle 5 和 IntelliJ 2018.3。无法识别的选项:--add-opens 或 java.base.java.lang=ALL-UNNAMED

    我有一组由 Gradle 4 10 3 构建的复杂项目 我可以从命令行构建它们 但也可以将它们导入 IntelliJ 2018 3 Ultimate 不会出现重大问题 当我将 Gradle 升级到 5 1 1 时 项目仍然可以从控制台正常构
  • Perl Windows IPv6

    我有一个使用 TCP IP 套接字的 Perl Windows 应用程序 我需要添加 IPv6 支持 我有一台 Windows 7 64 位计算机 它运行带有 Hurricane Electric 隧道的 IPv6 它的得分为 10 分 满
  • 如何在 Github 中为 Makefile 保留选项卡

    Github 自动将制表符转换为多个空格 所以 每次我创建一个Makefile在 Github 中 我需要在我的 Linux 盒子中克隆存储库并编辑Makefile using vim进而push将更改返回到我的 Github 存储库以避免
  • 具有透明背景的 JavaFX 按钮

    我有一些经典Button在 JavaFX 中 带有一个包含一些文本的框 我需要没有那个框的按钮 只需要文本 当我悬停按钮或用鼠标单击按钮时 它会将其颜色更改为不同的颜色 在 JavaFX 中 样式是通过使用 CSS 来完成的 button
  • 使用 D3.js 在曲线类型之间转换

    我想使用 D3 js 在曲线类型之间进行转换 看一眼这个街区 https bl ocks org iaindillingham 67835c954c5e3a1fd00eed35a0b37765 数据保持不变 但曲线类型发生变化 我原以为路径
  • 将 Json 转换为 Poco 集合/如何编写 For Each?

    我对 Azure Functions 还很陌生 我创建了一个 C WebHook Azure 函数 我想这是正确的事情 来获取我的 json 内容并将其转换为简单的 poco dto 对象的集合 public static class Ge
  • 我的应用程序未显示在 Google Play 中 [已关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我大约 18 小时前将我的应用程序上传到 google play 但它没有显示 开发者控制台显示 已发布 我想应该可以在 url
  • 使用ffmpeg处理rtsp流url时出现未知命令失败

    我想使用ffmpeg从rtsp流中抓取图像 命令如下 ffmpeg y i rtsp zigong stream xl02 cn 557 HongTranSvr DevId 1b038d27 858c 46a1 b803 a2984af34
  • 关闭 I/O 流

    如果我不关闭流 可能会发生哪些不好的事情 关闭操作会自动刷新吗 程序退出后所有的流都关闭了吗 提前致谢 如果您不关闭流 可能会发生不好的事情 你可能会用完文件句柄 您认为写入磁盘的数据可能仍在缓冲区中 仅 文件可能仍被其他进程锁定 取决于平
  • 将 .jar 文件添加到 git 存储库中

    我在 eclipse 上有一个项目 最近我创建了一个名为 lib 的新文件夹 并在其中添加了一些 jar 文件 我似乎无法将更改提交到 git 它只是没有出现在文件跟踪列表中 我已经从我的分支中的 gitignore 中删除了 jar 并提
  • 温莎城堡中的多个装饰器模式

    我们正在重新设计一些遗留软件以使其更具可测试性 并决定使用依赖注入和 Castle Windsor 来帮助我们 首先 我们的目标 许多装饰器都在数据流上工作 装饰器的多种组合是可能的 并且每种情况下的根节点可能需要从不同的地方获取数据 从技
  • ExpressJS:将参数传递给html不起作用

    这是我的server js var browserify require browserify middleware var express require express var app express var path require
  • 协作环境中实体框架的迁移

    我们有多个开发人员正在开发一个使用 Entity Framework 5 0 的项目 每个开发人员都使用自己的本地 SQL 2012 数据库 这样他就可以在不妨碍其他人的情况下进行开发和测试 起初 我们混合使用自动迁移和基于代码的迁移 这根
  • 有没有办法将 Google Analytics(分析)资产转移到新帐户?

    当我最初创建 Google 分析帐户时 我将所有网站 属性 添加到一个帐户中 现在我想将它们转移到他们自己的个人帐户 但我似乎找不到任何可用此选项的地方 我可以轻松创建一个新帐户 但这似乎需要创建一个新的属性和视图 如果可能的话 我想保留
  • 保护 CRTP:私有析构函数是唯一的解决方案吗?

    如何避免 template