gpt4 book ai didi

c++ - 如何正确地将功能填充到标准中?

转载 作者:太空狗 更新时间:2023-10-29 23:27:35 26 4
gpt4 key购买 nike

我最近从 Microsoft 编译器切换到 GCC。在许多事情中,我注意到 std::make_unique 变得不可用。这显然是因为 make_unique 不是 C++11 标准的一部分,而 Microsoft 恰好将其作为扩展包含在内。

我们计划很快转向 C++14,但与此同时,我编写了这个“垫片”函数,并将其放入 std

namespace std
{
template<typename T, typename... TArgs>
unique_ptr<T> make_unique(TArgs&&... args)
{
return std::unique_ptr<T>(new T(std::forward<TArgs>(args)...));
}
}

这解决了 gcc 上的问题。但是,我想这会在 Microsoft 方面引起问题,因为它是一个重复的定义。

有没有办法将功能正确填充到 std 中,这样它就不会在不同的编译器/C++ 标准上造成问题?我环顾四周,没有想到任何东西。我认为对于特定的标准功能,可能类似于包含防护?

#ifndef MAKE_UNIQUE_DEFINED
#define MAKE_UNIQUE_DEFINED
// Define make_unique
#endif

遗憾的是,std 似乎没有为特定函数定义 include 守卫。我还能做些什么来使它更正确并且与编译器/C++ 标准无关?

最佳答案

事实上,你可以。只需将您在帖子中提到的两个条件转换为条件宏定义即可:

#if defined(_MSC_VER) && __cplusplus == 201103L
# define MAKE_UNIQUE_DEFINED 1
#endif
  • _MSC_VER 检查 TU 是用 MSVC 编译的。 It's one of their predefined macros .您可以使用它来进一步优化检查,因为它是 MSVC 的编码版本号。
  • 201103L is the value of __cplusplus当 TU 被编译为 C++11 时(这是跨平台的标准)。
  • 如果 __cplusplus 没有为您正确定义(因为 Microsoft),您可以使用 _MSVC_LANG 宏代替它。

以上内容可用于包装您的“垫片”,正如您最初计划的那样。或者事实上,与这些版本相关的任何其他 MSVC 扩展。


作为替代方案,避免重新打开 std 命名空间(禁忌)。您可以使用命名空间将定义放在安全的地方,并控制您的程序如何解释它:

namespace extended_std {
#ifdef MAKE_UNIQUE_DEFINED
inline namespace
#else
namespace
#endif
shim {
// your definition goes here
}

#ifndef MAKE_UNIQUE_DEFINED
using std::make_unique;
#endif
}

该宏仅用于控制 extended_std::make_unique 所引用的内容。它要么使命名空间内联,将其内容倒入封闭的命名空间中。或者为 std::make_unique 添加一个 using 声明。

关于c++ - 如何正确地将功能填充到标准中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46905682/

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