我写了一个打印模板函数,打印"True"或"False"为bool类型值.
我试图将它应用于for_each算法,但它不起作用.
输出仍然是0或1.似乎模板专业化不起作用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)