Недавно я обнаружил, что использую boost::tuple
вместо std::pair
. Вы можете определить перечислители для каждого члена, поэтому очевидно, что это за член:
typedef boost::tuple<int, int> KeyValueTuple;
enum {
KEY
, VALUE
};
void foo (KeyValueTuple & p) {
p.get<KEY> () = 0;
p.get<VALUE> () = 0;
}
void bar (int key, int value)
{
foo (boost:tie (key, value));
}
Кстати, комментарии приветствуются, если есть скрытая плата за использование этого подхода.
РЕДАКТИРОВАТЬ: Удалить имена из глобальной области.
Просто быстрый комментарий относительно глобального пространства имен. В общем, я бы использовал:
struct KeyValueTraits
{
typedef boost::tuple<int, int> Type;
enum {
KEY
, VALUE
};
};
void foo (KeyValueTuple::Type & p) {
p.get<KeyValueTuple::KEY> () = 0;
p.get<KeyValueTuple::VALUE> () = 0;
}
Это выглядит так, что boost::fusion
связывает идентичность и ценность ближе друг к другу.