Вместо того, чтобы писать town-> first
, я хотел бы написать город-> название
. Встроенные именованные аксессоры ( Переименование первого и второго итератора карты и Именованные члены std :: pair ) - лучшие решения, которые я нашел до сих пор. Моя проблема с именованными аксессорами - это потеря безопасности типов:
pair
может относиться к struct {int index; двойное значение; }
или struct {int Population; двойной avg_temp; }
. Может ли кто-нибудь предложить простой подход, возможно, что-то похожее на черты?
Я часто хочу вернуть пару или кортеж из функции, и довольно утомительно вводить новый тип, такой как struct city {string name; int zipcode; }
и его ctor каждый раз. Я очень рад узнать о Boost и C ++ 0x, но мне нужно чистое решение C ++ 03 без Boost.
Обновление
Вопрос Эндрюдски: да, (гипотетический) синтаксис вроде pair
, который создаст отдельный тип из пары
, будет соответствовать вашим требованиям. Я даже не возражаю против того, чтобы реализовать пользовательский класс шаблона пары / кортежа ONCE и просто передать ему аргумент шаблона «свойства имени», когда мне нужен новый тип. Я понятия не имею, как будут выглядеть эти «черты имени». Может, это невозможно.
Вероятно, не стоящий дополнительной памяти, но если Вы хотите сохранить преимущество std::pair
или std::tuple
/ поддерживают совместимость с неизменным API, можно наследоваться от них и затем определить ссылки на их участников.
Кроме стоимости памяти, это идет с гигантским протестом, что типы STL обычно не имеют виртуальных деструкторов и могут таким образом вызвать утечки памяти, при попытке освободить использование указателя на базовый тип:
#include <tuple>
struct PairShadow : public std::pair<int, double> {
using std::pair<int, double>::pair;
PairShadow & operator=(PairShadow const &) { /*call parent op here*/ }
int & x = this->first;
double & y = this->second;
};
struct TupleShadow: public std::tuple<int, double> {
using std::tuple<int, double>::tuple;
PairShadow & operator=(PairShadow const &) { /*call parent op here*/ }
int & x = std::get<0>(*this);
double & y = std::get<1>(*this);
};
auto main() -> int {
auto twinShadow = PairShadow(1,3.0);
auto tupleShadow = TupleShadow(1,3.0);
return tupleShadow.y;
}
, С другой стороны, и возможно предпочтительно, как упомянуто @holyblackcat Вы могли также просто определить перегрузку к std::get<int>(PairShadow)
для Вашей структуры во многих случаях, пока Вы не пытаетесь соответствовать unchangable API, который конкретно требует std::pair
или std::tuple