(Re) named std :: pair members

Вместо того, чтобы писать 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 и просто передать ему аргумент шаблона «свойства имени», когда мне нужен новый тип. Я понятия не имею, как будут выглядеть эти «черты имени». Может, это невозможно.

25
задан Community 23 May 2017 в 10:31
поделиться

1 ответ

Вероятно, не стоящий дополнительной памяти, но если Вы хотите сохранить преимущество 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

0
ответ дан 28 November 2019 в 21:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: