gpt4 book ai didi

c++ - 为什么 bool 在 C++ 中不被视为 boost::true_type?

转载 作者:行者123 更新时间:2023-11-28 02:04:20 25 4
gpt4 key购买 nike

以下代码来自示例代码,用于说明如何使用 boost::type_traits。它将使用两种方法来交换两个变量。很容易理解,当两个变量都是整型(int)时,它们的类型特征对应的是true_type。但是,当两个变量是 bool 类型时,它们不再被视为 true_type。为什么会这样?谢谢。

#include <iostream>
#include <typeinfo>
#include <algorithm>
#include <iterator>
#include <vector>
#include <memory>

#include <boost/test/included/prg_exec_monitor.hpp>
#include <boost/type_traits.hpp>

using std::cout;
using std::endl;
using std::cin;

namespace opt{

//
// iter_swap:
// tests whether iterator is a proxying iterator or not, and
// uses optimal form accordingly:
//
namespace detail{

template <typename I>
static void do_swap(I one, I two, const boost::false_type&)
{
typedef typename std::iterator_traits<I>::value_type v_t;
v_t v = *one;
*one = *two;
*two = v;
}
template <typename I>
static void do_swap(I one, I two, const boost::true_type&)
{
using std::swap;
swap(*one, *two);
}

}

template <typename I1, typename I2>
inline void iter_swap(I1 one, I2 two)
{
//
// See is both arguments are non-proxying iterators,
// and if both iterator the same type:
//
typedef typename std::iterator_traits<I1>::reference r1_t;
typedef typename std::iterator_traits<I2>::reference r2_t;

typedef boost::integral_constant<bool,
::boost::is_reference<r1_t>::value
&& ::boost::is_reference<r2_t>::value
&& ::boost::is_same<r1_t, r2_t>::value> truth_type;

detail::do_swap(one, two, truth_type());
}


}; // namespace opt

int cpp_main(int argc, char* argv[])
{
//
// testing iter_swap
// really just a check that it does in fact compile...
std::vector<int> v1;
v1.push_back(0);
v1.push_back(1);
std::vector<bool> v2;
v2.push_back(0);
v2.push_back(1);
opt::iter_swap(v1.begin(), v1.begin()+1);
opt::iter_swap(v2.begin(), v2.begin()+1);

return 0;
}

最佳答案

您的代码中已经有了答案(作为注释):

See is both arguments are non-proxying iterators

vector<bool>有代理迭代器,因为你不能直接引用一点。如果vector<bool>将其元素存储为单独的 bool 值(取 1-4 个字节/条目,具体取决于系统),迭代器可以是非代理的。但是,vector<bool>存储 8 个条目/字节并使用代理迭代器。

关于c++ - 为什么 bool 在 C++ 中不被视为 boost::true_type?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38189448/

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