在 C++20 中获得向后兼容概念的推荐方法
Recommended way to have backward compatible concepts in C++20
我对概念还很陌生,但到目前为止我很喜欢它们并且想在项目中使用它们。问题是我还希望该项目能够使用早期的 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 是已定义的概念。该解决方案有效,但我不喜欢冗长。是否有推荐的方法在不破坏向后编译兼容性的情况下将概念引入代码库?
实际上,如果您希望能够通过宏检查轻松地从代码中删除概念,则不应使用任何类型的紧凑概念语法。这意味着您应该始终使用明确的 requires 子句。这使得语法更容易#if
。
如果您有过多的概念,其中存在多个定义且具有更多限制性概念,那么仅删除这些概念并不容易。它是接口的一部分,您可以通过不同的接口传递类型,编译器会选择通过复杂的重载方案实例化哪个模板。
所以你必须使用某种形式的 SFINAE 来做同样的事情。但具体你必须做什么取决于你具体是如何做的。在某些情况下,这可能很容易,例如使用简单的模板函数,您可以将其转换为单个定义中的 if constexpr
块。
但其他情况要困难得多。您可以将 requires
子句放在模板 class 的非模板成员上。用 SFINAE 做同样的事情要困难得多。
因此,如何获得相同的效果将取决于您要达到的效果。
我对概念还很陌生,但到目前为止我很喜欢它们并且想在项目中使用它们。问题是我还希望该项目能够使用早期的 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 是已定义的概念。该解决方案有效,但我不喜欢冗长。是否有推荐的方法在不破坏向后编译兼容性的情况下将概念引入代码库?
实际上,如果您希望能够通过宏检查轻松地从代码中删除概念,则不应使用任何类型的紧凑概念语法。这意味着您应该始终使用明确的 requires 子句。这使得语法更容易#if
。
如果您有过多的概念,其中存在多个定义且具有更多限制性概念,那么仅删除这些概念并不容易。它是接口的一部分,您可以通过不同的接口传递类型,编译器会选择通过复杂的重载方案实例化哪个模板。
所以你必须使用某种形式的 SFINAE 来做同样的事情。但具体你必须做什么取决于你具体是如何做的。在某些情况下,这可能很容易,例如使用简单的模板函数,您可以将其转换为单个定义中的 if constexpr
块。
但其他情况要困难得多。您可以将 requires
子句放在模板 class 的非模板成员上。用 SFINAE 做同样的事情要困难得多。
因此,如何获得相同的效果将取决于您要达到的效果。