在 c++11 中,我有非常简洁且有效的代码用于按类型提取 std::tuple
项(据我所知,此功能甚至是 placed 到 c++14 STL)
现在我面临着通过继承类规范选择项目的任务
struct A
{
int a;
};
struct B : public A
{
int b;
};
...
auto tval = std::make_tuple(1, B());
//now I would like to reference items as following:
tuple_ref_by_inheritance<A>(tval).a = 5; //Access to B instance by parent A
以下代码是我不成功的尝试:
template< class T, class Tuple >
struct tuple_ref_index;
// recursive case
template<class T, class Head, class... Tail >
struct tuple_ref_index<T, std::tuple<Head, Tail...> >
{
enum { value = tuple_ref_index<T, std::tuple<Tail...>>::value + 1 };
};
template<class T, class Head, class... Tail >
struct tuple_ref_index<T, std::tuple<Head, Tail...> >
{
const static typename std::enable_if<
std::is_same<T, Head>::value>::type* _= nullptr;
enum { value = 0 };
};
template <class T, class Tuple>
inline T& tuple_ref_by_inheritance(Tuple& tuple)
{
return std::get< tuple_ref_index<T, Tuple>::value >(tuple);
}
最佳答案
#include <type_traits>
#include <utility>
#include <cstddef>
#include <tuple>
template <typename Base, typename Tuple, std::size_t I = 0>
struct tuple_ref_index;
template <typename Base, typename Head, typename... Tail, std::size_t I>
struct tuple_ref_index<Base, std::tuple<Head, Tail...>, I>
: std::conditional<std::is_base_of<Base, Head>::value
, std::integral_constant<std::size_t, I>
, tuple_ref_index<Base, std::tuple<Tail...>, I+1>
>::type
{
};
template <typename Base, typename Tuple>
auto tuple_ref_by_inheritance(Tuple&& tuple)
-> decltype(std::get<tuple_ref_index<Base, typename std::decay<Tuple>::type>::value>(std::forward<Tuple>(tuple)))
{
return std::get<tuple_ref_index<Base, typename std::decay<Tuple>::type>::value>(std::forward<Tuple>(tuple));
}
关于c++ - std::tuple,通过继承类型获取项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33999868/