【发布时间】:2015-03-04 02:24:30
【问题描述】:
我想与boost::swap 等效,并且在我的环境中,可以包含或不包含标准标头。取决于项目许可和其他内容。
我想让部分代码受到保护检测器的保护:
让我们考虑一个编译单元。
项目特定的,预先写好的潜力包括:
#include <algorithm> // (or <utility> for C++11 projects)
稍后在我的交换实用程序标头中包含的项目代码中:
namespace MyCompany
{
template<class T1, class T2>
void swap(T1& left, T2& right)
{
#ifdef _ALGORITHM_ // you get the idea.
std::swap(left, right);
#else
// fallback impl
#endif
}
}
我简化了,因为我们不是在这里讨论 ADL 技巧的细节,但它会被包括在内。
这里是我在说什么的参考,但这与这个问题无关:
http://www.boost.org/doc/libs/1_57_0/boost/core/swap.hpp
所以这个问题是关于如何检测标准标题包含? _ALGORITHM_ 守卫出现在 Visual Studio 提供的标题中,但我在 http://www.cplusplus.com/reference/algorithm/ 上没有看到它应该有任何我可以检查的宏。
(最后一点:这个问题有点偏向XY。我真正想要的是检测std::swap函数的存在,而不是标题。)
【问题讨论】:
-
所以你想要反过来?使用专门的交换作为后备?
-
假设,作为惯例,我们代码库的客户端将使用 MyCompany::swap 作为默认交换函数,就像 boost 用户广泛采用 boost::swap 一样。然而,该特殊交换的实现可以在内部使用 std::swap,以防被交换的 T1 和 T2 类型具有 std::swap 的特化。但是,如果此时不包含标准标头(因为我的实用程序不会包含它们,因为尊重更严格的许可规则),我想检测到这一点并且永远不要调用 std::swap。
-
我尊重您的意图,但从长远来看,这会导致难以追踪的错误;客户端的代码可能会根据它们是否
#include <algorithm>默默地改变行为,您将不得不处理客户端支持请求 -
how to implement is_swappable...的可能重复项...?
-
我没有得到“许可规则”位。
std::swap的许可证与operator+(int,int)的许可证相同。当然你不想暗示后者也可以由用户提供?!