В настоящее время я использую std::map
, чтобы сохранить пар ключ/значение:Сделать станд :: установлен использовать оператор преобразования при сравнении элементов
#include <map>
using K = int;
struct P {}; // some useful payload
int main()
{
std::map< K, P const > m;
m.insert({1, {}});
auto it = m.find(1);
// access:
it->first;
it->second;
}
int
здесь только для примера. mapped_type
всегда const
в моем случае.
Для доступа к полезной нагрузке P const
Мне нужно использовать не слишком информативное имя second
. То же самое касается first
. Я хочу назвать это просто payload
или как-нибудь еще.
Чтобы достичь этого, я изобрел следующий подход:
#include <set>
using K = int;
struct P {};
struct A
{
K key;
P payload;
operator K const &() const { return key; }
};
struct less
{
using is_transparent = void;
bool operator() (K const & l, K const & r) const
{
return l < r;
}
};
int main()
{
std::set< A, less > s;
s.insert({1, {}});
auto it = s.find(1);
// access:
it->key;
it->payload;
}
Здесь я делаю std::set
использовать оператор преобразования каждый раз, когда для типа ключа. Оно работает. Но запрещен ли подход? Есть undefined поведение?
Выглядит отлично. (Но я не уверен, что опубликую его как ответ) – krzaq
Многие программисты на С ++ держатся подальше от использования операторов преобразования из-за вопросов, подобных вашим. Слишком много случаев, операторы преобразования либо вызывают проблемы компиляции, либо, если это не так, возникают проблемы времени выполнения, когда программист обнаруживает, что их операция преобразования используется, не зная, что она используется. Отладка таких программ превращается в болезненную ситуацию. – PaulMcKenzie
@PaulMcKenzie Вы правы. Но я хочу использовать выше подход где-то в глубине моей библиотеки. Пользовательский код будет далек от таких подходов, подверженных ошибкам. – Orient