Получение правильного value_type - PullRequest
5 голосов
/ 17 ноября 2011

В моем классе есть член:

std::vector<std::string> memory_;

Теперь я хотел бы, чтобы fnc возвращал то, что находится в первом элементе памяти, но я не хочу указывать std::string в качестве возвращаемого типана случай, если позже я решу использовать другой тип для этой цели, поэтому я попробовал это, но это не работает:

typename decltype(memory_)::value_type call_mem()
{
    return memory_[0];
}

Есть идеи, как указать тип возвращаемого значения наиболее общим способом?

Ответы [ 3 ]

4 голосов
/ 17 ноября 2011

Пока вы используете стандартный контейнер, он должен работать, и я думаю, что все в порядке.

В качестве альтернативы, поскольку он является членом класса, вы можете использовать typedef и выставлять value_type как вложенный тип класса:

class demo
{
   public:
     typedef std::vector<std::string> container_type;
     typedef container_type::value_type value_type;

     value_type call_mem()
     {
         return *std::begin(memory_); //it is more generic!
     }

   private:        
     container_type memory_;
};

Обратите внимание, что *std::begin(memory_) является более общим, чем memory_[0] и *memory_.begin(), так как с ним будут работать даже массивы, но это вряд ли принесет вам пользу в реальном коде.

1 голос
/ 17 ноября 2011

Вам просто нужно немного изменить форматирование и использовать ключевое слово auto:

auto call_mem() -> decltype(memory_)::value_type
{
    return memory_[0];
}
0 голосов
/ 17 ноября 2011

На самом деле вы можете просто decltype полное выражение:

decltype(memory_[0]) call_mem()
{
    return memory_[0];
}

Но убедиться, что memory_ объявлено раньше call_mem.(и используйте std::begin для обобщения в другие контейнеры, как объяснено @ Nawaz .)

...