Получение правильного value_type

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

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

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

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

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

3 ответа

Решение

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

Кроме того, поскольку он является членом класса, вы можете использовать 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() как с этим, даже массивы работали бы, но это менее вероятно принесет пользу вам в реальном коде.

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

auto call_mem() -> decltype(memory_)::value_type
{
    return memory_[0];
}

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

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

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

Другие вопросы по тегам