Я developping в какой-то структуры кортежа, и я хотел бы, чтобы позволить пользователю использовать его элементы в виде полей,Naming элементы кортежа
ОБЪЯСНЕНИЕ:
это мой кортеж:
template<typename ...Ts>
struct myTuple{
std::tuple<Ts...> data;
template<size_t I>
inline type<I>& get_t() { // type<I> is the I'th type
return std::get<I>(data);
}
// Other stuff
};
на данный момент пользователь может иметь это следующим образом:
struct UserStruct{
myTuple<int,bool,string> t;
// Other stuff
}
и использовать его как,
UserStruct ob;
ob.t.get_t<0>() = 0;
Который немного комплекс ... Так что я сделал это таким образом
struct UserStruct{
myTuple<int,bool,string> t;
decltype(mo.get_t<0>()) myInt() {
return mo.get_t<0>();
}
decltype(t.get_t<1>()) myChar() {
return t.get_t<1>();
}
decltype(t.get_t<2>()) myString() {
return t.get_t<2>();
}
};
так что он может использовать его непосредственно: Минт() = 0;
Моя цель состоит в том, что он может использовать кортеж, как если бы он имел int, bool, string
членов данных без сохранения ссылок, а это значит, мне нужна функция (или функтор), чтобы получить ссылку, так что мое решение хорошо, но пользователю необходимо определить функции. (И геттер выглядит гораздо хуже в реальном коде)
Так что я хотел бы что-то вроде этого:
struct UserStruct{
myTuple<int,bool,string> t;
MyFunctor<0> myInt; //or an alias to a function
MyFunctor<1> myChar;
MyFunctor<2> myString;
};
Можете ли вы использовать C++ 14? Он имеет 'std :: get()'. –
Biffen
Я уже использую его, я добавил тег –
Что делать, если кортеж имеет 2 строки или 2 символа или 2 интервала? Как вы будете различать их? У меня смутное воспоминание о Трабе Саттере о будущей версии C++, позволяющей использовать псевдонимы для std :: get, поэтому вы можете назвать индексы. Я не уверен, что с ним происходит. – Robinson