gpt4 book ai didi

c++ - 如何根据C++版本选择函数实现

转载 作者:行者123 更新时间:2023-11-30 01:44:10 25 4
gpt4 key购买 nike

我重新定义了某些 C++ 函数对象(STL 函数)来为它们提供 constexpr operator()。我需要这些函数在编译时进行评估以用于模板元编程。 C++14 为 STL 函数库提供了等价的 constexpr。目前我正在使用 C++11 编译代码,但最终可能会升级到 C++14。我如何实现这些,以便在我升级到 C++14 时,它会自动从 STL 中选择函数对象,而不是我的自定义实现。
到目前为止,这是我的做法:

namespace foo {
template <class T = void>
struct less {
constexpr bool operator()(T const& lhs, T const& rhs) const {
return lhs < rhs;
}
};
}

编辑:我知道如果我只是将我的命名空间作为 std 的别名,这可能可以通过 __cplusplus 来完成。然而,这将是一个糟糕的解决方案,因为我会污染所有其他实例的命名空间 foo。

最佳答案

选项,首先是工作量最少且对代码影响最小的方法:

  • 使用编译器的包含文件路径来选择不同版本的 header 。

  • 编译器版本嗅探和条件编译(例如 #ifdef )。

  • 批发代码编辑,可能是自动化的。

编译器嗅探非常脆弱,但很常见。

通常只检查 __cplusplus 的值是不够的.


例如,使用编译器的包含路径,您首先要定义一个 header <relops.hpp> ,它只是根据 C++14 功能、默认实现定义或命名所有内容,并将其放置在常规 header 包含目录中。

并且通过编译器的包含路径(例如 CPATH 用于 g++,INCLUDE 用于 Visual C++),如果特定编译器需要,您可以指示它首先查找 <relops.h>在其他一些目录中用于特定于系统的 header 。

还有这个<relops.h>会自己定义事物,就像在您提供的代码中一样。


使用条件编译,您可以根据 __cplusplus 等宏来确定编译器和版本。 , _MSC_VER , __GNUC__ ,适用于 Mac 的东西,可能更多。您将定义一些符号作为结果,例如IS_CPP14 .然后你会使用 #if IS_CPP14#else#endif .

关于c++ - 如何根据C++版本选择函数实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36605888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com