Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有一种方法可以通过使用宏来检测是否包含标准头?_C++_Utility - Fatal编程技术网

C++ 有没有一种方法可以通过使用宏来检测是否包含标准头?

C++ 有没有一种方法可以通过使用宏来检测是否包含标准头?,c++,utility,C++,Utility,我想制作一个等价于boost::swap的文件,在我的环境中,可以包含标准头,也可以不包含标准头。取决于项目许可和其他内容。 我想让部分代码受到防护探测器的保护: 让我们考虑一个编译单元。 具体项目,上述书面潜力包括: #include <algorithm> // (or <utility> for C++11 projects) #包括 那么这个问题是关于如何检测标准标题包含的问题?visual studio提供的标题中有\u算法保护,但我没有读到它应该有任何可以检

我想制作一个等价于
boost::swap
的文件,在我的环境中,可以包含标准头,也可以不包含标准头。取决于项目许可和其他内容。
我想让部分代码受到防护探测器的保护:

让我们考虑一个编译单元。 具体项目,上述书面潜力包括:

#include <algorithm> // (or <utility> for C++11 projects)
#包括

那么这个问题是关于如何检测标准标题包含的问题?visual studio提供的标题中有
\u算法
保护,但我没有读到它应该有任何可以检查的宏


(最后一点注意:这个问题有点偏袒XY。我真正想要的是检测是否存在
std::swap
函数,而不是标题。)

有一个选项可以让您的重载比其他选项“更匹配”。然后,仅当它们不存在时,才会选择您的版本:

#if 0
#include <algorithm>
using std::swap;
#endif

template <typename T>
struct ForceLessSpecialized {
  typedef T TYPE;
};

template <typename T>
void swap (T &, typename ForceLessSpecialized<T>::TYPE &) {
}

void bar () {
  int i;
  swap (i, i);
}  
使用
std::swap
中的伪参数专门化我们的swap,给出:

Deduction from First parameter:  T == T1
Deduction from Second parameter:  Non Deduced Context
推断出的
T
T1
,推断成功

专门化
std::swap
为我们的swap使用伪参数,得到:

Deduction from First parameter:  T == T2
Deduction from Second parameter:  T == ForceLessSpecialized<T2>::TYPE
从第一个参数推断:T==T2
从第二个参数推断:T==ForceLessSpecialized::TYPE
T
的推断类型不同,因此这被视为推断失败


因此,
std::swap
的合成参数可用于专门化我们的模板,但我们模板的合成参数不能用于专门化
std::swap
<代码>标准::交换被视为更加专业化,因此赢得了部分订单。

C++17带来了一个新功能,现在使这成为可能。

它被称为
\u包含

这里的示例:
#如果_u有u include()


编辑:这与问题的要求不同,它只是告诉可达性。

那么你想要相反的结果吗?要使用专门的交换作为后备吗?比方说,作为惯例,我们代码库的客户端将使用MyCompany::swap作为默认交换函数,就像boost用户广泛采用boost::swap一样。但是,如果交换的T1和T2类型具有std::swap的专门化,则该特殊交换的实现可以在内部使用std::swap。但是,如果此时不包括标准头(因为我的实用程序由于遵守更严格的许可规则而不包括它们),我希望检测到这一点,并且永远不要调用std::swap;客户的代码可能会悄悄地改变行为,这取决于它们是否包含,并且您必须处理客户支持请求可能重复的…?我不了解“许可规则”位。
std::swap
的许可证与
operator+(int,int)
的许可证相同。你肯定不想建议后者也可以由用户提供?!妈的,这工作太棒了。绝对是一个很好的阅读标准。14.5.5.2指类别,实际段落为14.5.6.2,但有链接。谢谢:)这很有趣,因为昨天我读了Herb Sutter关于“为什么不专门化函数模板”的文章。好书well@v.oddou:正如您所指出的,最近的标准中的段落是14.5.6.2,我使用的是'03标准,它的名称为14.5.5.2。但它返回的是标题是否存在,而不是它是否已经包含在内。该死,真的吗?我读得不够深入。。。(看完后回来)天哪,你说得对。这不是我想问的问题。这是一个完全不同的特征
Deduction from First parameter:  T == T1
Deduction from Second parameter:  Non Deduced Context
Deduction from First parameter:  T == T2
Deduction from Second parameter:  T == ForceLessSpecialized<T2>::TYPE