if
の()
内容全体が変数宣言で()
始まる場合 (つまり、変数宣言以外の何ものでもない場合) にのみ、 内で変数を定義できます。
あなたがやろうとしているのは、変数を宣言してから、それをテストすることです。それは許可されていません。
2 行バージョンにフォールバックするか、次のようにorfind
を使用するコンテナーベースを作成できます。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
、上記はオプションのを返します。これは、 ean コンテキストでiterator
評価されると、アイテムが見つからない場合です。bool
false
次のように入力できます。
if( auto op_it = my_find( v, 2 ) ) {
auto it = *op_it; // optional, but saves on `*` elsewhere
// code
}
そしておおよそあなたが望むものを手に入れます。
optional
boost
、たぶんstd::tr2
、おそらくstd::
C++14 で利用できます。boost
とはstd
少し異なります。