为什么for_each不能在这里选择正确的印刷品

ice*_*ice 4 c++ templates

我写了一个打印模板函数,打印"True""False"为bool类型值.

我试图将它应用于for_each算法,但它不起作用.

输出仍然是01.似乎模板专业化不起作用for_each.怎么会发生这种情况?

如何使代码按预期工作?

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <ctime>

using namespace std;

template <typename T>
void _print(const T& i)
{
    cout<<i<<endl;
}
template <>
void _print<bool>(const bool& i)
{
    if (i == 0)
        cout<<"False"<<endl;
    else
        cout<<"True"<<endl;
}

class print
{
public:
  template <typename T>
  void operator()(const T& val) const { _print(val); };
};

int main()
{
  auto even = [&](int i)->bool{return (i%2==0);};
  srand(time(NULL));
  vector <int> test(3);
  generate(test.begin(),test.end(),[]()->int{return rand()%100;});
  for_each(test.begin(),test.end(),print());
  vector <bool> flag(3);
  transform(test.begin(),test.end(),flag.begin(),even);
  for_each(flag.begin(),flag.end(),print());

  return 0;

}
Run Code Online (Sandbox Code Playgroud)

输出是:

34
23
3
1
0
0
Run Code Online (Sandbox Code Playgroud)

但我希望:

34
23
3
True
False
False
Run Code Online (Sandbox Code Playgroud)

Jar*_*d42 10

邪恶的一部分std::vector<bool>.
vector<bool>::reference不是bool你所期望的,而是代理人.

你可以添加这个额外的重载(如果你愿意,可以添加特殊化):

void _print(const vector<bool>::reference& i)
{
    _print<bool>(i);
}
Run Code Online (Sandbox Code Playgroud)

实例