如果 's的全部内容都以变量声明开头(即,如果它只是一个变量声明),则只能在if
's内定义一个变量。()
()
您要做的就是声明一个变量,然后对其进行测试。这是不允许的。
您可以回退到两行版本,也可以编写一个基于容器的find
使用boost::optional
或std::tr2::optional
如下:
namespace aux {
using std::begin; using std::end;
template<typename C> auto adl_begin( C&& c )->decltype( begin(std::forward<C>(c)) )
{ return begin(std::forward<C>(c)); }
template<typename C> auto adl_end( C&& c )->decltype( end(std::forward<C>(c)) )
{ return end(std::forward<C>(c)); }
}
using aux::adl_begin; using aux::adl_end;
template<typename C, typename U>
optional< decltype( typename std::decay<*adl_begin( std::declval<C&>() )>::type ) >
my_find( C&& c, U&& u ) {
auto it = std::find( adl_begin(c), adl_end(c), std::forward<U>(u) );
if (it == adl_end(c))
return {none_t};
else
return {it};
}
上面不是返回一个iterator
,而是返回一个可选的iterator
,当在bool
ean 上下文中评估时,false
如果找不到该项目。
您现在可以键入:
if( auto op_it = my_find( v, 2 ) ) {
auto it = *op_it; // optional, but saves on `*` elsewhere
// code
}
并大致得到你想要的。
optional
在 C++14中可用boost
,在可能std::tr2
,并且可能std::
在 C++14 中可用。和boost
略有std
不同。