【问题标题】:Recommended way to have backward compatible concepts in C++20在 C++20 中具有向后兼容概念的推荐方法
【发布时间】:2021-07-10 16:28:58
【问题描述】:

我对概念还很陌生,但到目前为止我很喜欢它们,并希望在项目中使用它们。问题是我还希望项目能够使用早期的 C++ 标准进行编译。到目前为止,我提出了以下实用化的解决方案:

#if ISCPP20
   template<NumT number = double,Index index = int,CoordinateContainer<number> coords>
#else
   template<class number = double,class index = int,class coords>
#endif

其中 NumT、Index 和 CoodinateContainer 是定义的概念。该解决方案有效,但我不喜欢冗长。是否有推荐的方法将概念引入代码库,同时又不破坏向后编译兼容性?

【问题讨论】:

    标签: c++ c++20 c++-concepts


    【解决方案1】:

    实际上,如果您希望能够通过宏检查轻松地从代码中删除概念,则不应使用任何紧凑的概念语法。这意味着您应该始终使用显式的 requires 子句。这使得#if 周围的语法更容易。

    如果您有重载的概念,其中存在多个定义更严格的概念,这不是一件容易删除的事情。它是您接口的一部分,您可以通过不同的接口传递类型,编译器通过复杂的重载方案选择要实例化的模板。

    因此,您必须使用某种形式的 SFINAE 来执行等效操作。但究竟你必须做什么取决于你是如何做的。在某些情况下,这很容易,例如使用简单的模板函数,您可以将其转换为单个定义中的 if constexpr 块。

    但其他情况要困难得多。您可以将requires 子句放在模板类的非模板成员上。用 SFINAE 做同样的事情要困难得多。

    因此,如何获得相同的效果将取决于您要达到的效果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-30
      • 2021-07-12
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 2021-03-04
      • 2021-10-06
      • 2012-12-07
      相关资源
      最近更新 更多