Получение правильного 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.)