5

必要に応じて const または非 const ポインターを返すことを除いて、const データと非 const データに対して同じように機能するテンプレート化された関数を作成したいと考えています。

たとえば、コンテナー内の一致する要素へのポインターを返したいとします。

template <class Container, class Pred>
typename Container::value_type* getValuePtrIf(Container& c, Pred pred)
{
    auto it=std::find_if(c.begin(), c.end(), pred);
    return (it!=c.end()) ? &(*it) : nullptr;
}

ただし、これを const および非 const 呼び出し用にビルドすることはできません。宣言から const を省略するとContainer& c、const ポインターを返すことはできませんが、変更するとconst Container& cconst ポインターを返すことができますが、const 以外のケースは構築されません。

constがテンプレート パラメータの一部として解釈されContainer、この関数の 1 つのバージョンを定義するだけで済むように、これを定義する方法はありますか?

4

2 に答える 2

6

コードから、コンパイラで C++11 がサポートされているようです。次に、おそらくdecltypeおよび末尾の戻り値の型も使用できます。

template <class Container, class Pred>
auto getValuePtrIf(Container& c, Pred pred) -> decltype(&*std::begin(c))
{
    auto it=std::find_if(std::begin(c), std::end(c), pred);
    return (it!=std::end(c)) ? &(*it) : nullptr;
}

itstd::begin(c)はあなたに与えられた型(iteratorまたはconst_iterator) になるので、 の型&(*it)は の と同じですdecltype(&*std::begin(c))

于 2013-11-11T13:04:46.310 に答える