如何检查函数是否存在

时间:2014-01-27 13:50:59

标签: c++ templates c++11 macros

我想实现自己的std::make_unique函数,函数是std命名空间的一部分。我知道这个辅助函数被添加到C ++ 14中,但我没有在C ++ 11中使用它。所以,我想用一些C ++ 11模板魔术检查它(找不到任何带宏的选项)来检查一个函数是否存在于std命名空间内,如果它没有我自己定义它。那可能吗?我甚至不知道从哪里开始。

5 个答案:

答案 0 :(得分:6)

无法::std命名空间添加新功能。您只能添加现有模板的特化,甚至只能添加您自己的类型。

答案 1 :(得分:6)

最好的办法是使用标准__cplusplus宏,对于C ++ 11,它是201103L。对于C ++ 14以上,它将是一个不同的值。

答案 2 :(得分:1)

这不是一个真正的回答,但我想指出委员会正在考虑(见n3694)一般性问题:程序员如何确定某个实现是否具有特定功能(例如{{1}或者不是吗?

目前,我们所拥有的最好的是宏std::make_unique(根据Bathsheba' s post),但正如n3694中所解释的那样,这并不是{{3}}。给出程序员可能需要的细粒度。 (OP的问题就是这种需求的一个例子。)

答案 3 :(得分:1)

自己介绍std::make_unique是未定义的行为,期间。没有安全的方法来做到这一点。最重要的是,它也是不可取的 - 您获得的优势很小,维护和代码可理解性成本很高。

更多的是,你的make_unique几乎无法与发布的内容完全匹配,因此您的代码将具有奇怪的版本依赖性。

更好的计划是在您自己的实用程序命名空间中的其他位置定义您自己的make_unique。如果C ++ 1y处于活动状态,您可以using std::make_unique导入它而不是您自己的make_unique

这可以保持您的代码标准。 utility::make_unique的用户也应该清楚,它不能保证与C ++ 1y make_unique完全相同。

这也可以解决在std::make_unique标准化之前检测{{1}}的问题,然后确定它是否与您最终实施的界面相匹配。

答案 4 :(得分:0)

#include <memory> // std::shared_ptr, std::unique_ptr

// C++11 check doesn't work in Visual Studio 2013/2015 properly because they are not fully C++11 compliant.
// https://connect.microsoft.com/VisualStudio/feedback/details/763051/a-value-of-predefined-macro-cplusplus-is-still-199711l
#ifndef WIN32
// C++11 Check
#if __cplusplus < 201103L
#error This library needs at least a C++11 compliant compiler.
#endif // >= C++11
#endif // WIN32


namespace std {

  // Note: despite not being even C++11 compliant, Visual Studio 2013 has their own implementation of std::make_unique.
#ifndef WIN32
#if (__cplusplus >= 201103L && __cplusplus < 201402L)
  // Define std::make_unique for pre-C++14
  template<typename T, typename... Args> inline unique_ptr<T> make_unique(Args&&... args) {
    return unique_ptr<T>(new T(forward<Args>(args)...));
  }
#endif // C++11 <= version < C++14
#endif // WIN32

} // namespace std