在 C++20 中具有向后兼容概念的推荐方法

时间:2021-07-10 16:28:58

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

我对概念还很陌生,但到目前为止我很喜欢它们,并想在项目中使用它们。问题是我还希望该项目能够使用早期的 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 是定义的概念。该解决方案有效,但我不喜欢冗长。有没有推荐的方法可以在不破坏向后编译兼容性的情况下将概念引入代码库?

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

相关问题