我有一个方法接受sha1哈希的std :: vector作为字符串,其长度必须为20个字符。在单行中断言这个前提条件得到尊重会很棒。
void MyClass::setSha1Sums(const std::vector<std::string>& sha1Sums)
{
assert(magic_oneliner_which_verifies_that_all_strings_are_20_chars_long);
sha1Sums_ = sha1Sums;
}
答案 0 :(得分:5)
C ++ 03,带有提升(&gt; = 1.33):
std::find_if( sha1Sums.begin(), sha1Sums.end()
, boost::bind( &std::string::size, _1 ) != 20U
) == sha1Sums.end();
请注意,!=
是一个重载运算符,可以提升资源,使构建更复杂的绑定更简单。
http://www.boost.org/doc/libs/1_45_0/libs/bind/bind.html#operators
答案 1 :(得分:3)
我会使用std::adjacent_find
:
bool same_lengths =
std::adjacent_find(v.begin(), v.end(), [](std::string a, std::string b)
{
return a.length() != b.length();
}) == v.end();
这将查找两个具有不同长度的连续元素。如果所有长度都相同,则返回结束迭代器。
答案 2 :(得分:2)
std::all_of()
返回true
。
bool result = std::all_of(sha1Sums.begin(), sha1Sums.end(), [](std::string &s)
{
return s.length() == 20;
});
答案 3 :(得分:1)
您将需要一个“for each”函数,该函数根据传递的向量返回true或false。然后,您可以将该函数传递给assert语句中的字符串向量。
答案 4 :(得分:1)
不是一个单行,但我发现这接近当前C ++中最明确的解决方案(而不是带有lambda的std :: all_of或0x中的foreach循环):
void MyClass::setSha1Sums(std::vector<std::string> const &sha1Sums) {
sha1Sums_.clear();
BOOST_FOREACH(string const &x, sha1Sums) {
assert(x.size() == 20);
sha1Sums_.push_back(x);
}
}
这也有一个小优势,你可以轻松找到(例如记录)有问题的字符串,以便在出现问题时解决问题。