c++ - 为什么 for_each 不能在这里选择正确的打印

标签 c++ templates

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

我试图将它应用于 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;

}

输出是:

34
23
3
1
0
0

但我希望:

34
23
3
True
False
False

最佳答案

std::vector<bool>的邪恶部分| .
vector<bool>::reference不是 bool如您所料,只是一个代理。

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

void _print(const vector<bool>::reference& i)
{
    _print<bool>(i);
}

Live example

关于c++ - 为什么 for_each 不能在这里选择正确的打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25791719/

相关文章:

c++ - 使用模板参数实例化模板类

Django模板: custom template tag to display dictionary of dictionary

c++ - C++中有没有一种设计模式可以方便地以统一的函数接口(interface)查询不同类型的数据?

c++ - boost tokenizer 的随机行为

c++ - 如何避免有关可能丢失数据的警告?

c++ - 如何填充非线性树

c++ - 如何让英特尔 TBB 库在至强融核上可用

c++ - QBoxLayout 添加 QTextEdit 全尺寸和 QPushButton

javascript - 创建模板并在 JS 中使用变量进行替换

function - 在 if 语句中使用函数 return 或在 go 模板中使用变量