【发布时间】:2019-03-10 05:41:43
【问题描述】:
我喜欢跨度,所以我在这里和那里使用gsl::span。但是 - 在 C++20 中,它将改为 std::span*。我使用std::optional,但是对于C++14 代码,它需要是std::experimental::optional。以此类推。
什么是在这些变体(有时可能超过两个)之间进行编译时选择的惯用且面向未来的方法,以便我的实际代码可以只使用一个标记序列编译成正确选择的跨度,或可选的,或其他类似的构造?
注意:我想避免污染全局命名空间。
* 好吧,从技术上讲,我以后也可以使用gsl::span,但这个问题的想法是在标准可用时使用标准中的内容,并在此之前使用最接近的替代方案。
【问题讨论】:
-
"在 C++20 中,它需要改为 std::span" 为什么它需要?您的代码不会仅仅因为您可以使用另一种
span类型而停止工作。至于experimental::optional,这甚至不是要求在C++14实现中实现的。 -
相关codereview:codereview.stackexchange.com/q/136350/49895
-
为什么不能使用宏? ABI 兼容性?如果您需要 ABI 兼容性,您可能会感到厌烦,但谁知道呢,有人可能会让我大吃一惊……
-
@NicolBolas:见编辑。
-
@Justin:但是包含宏仍然不能解决整个问题。你会写什么而不是
int foo(std::span sp)? ...并建议您将答案写为问题的答案。
标签: c++ idioms stdoptional std-span