c++ - std::tuple,通过继承类型获取项目

标签 c++ c++11 tuples template-meta-programming

在 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));
}

DEMO

关于c++ - std::tuple,通过继承类型获取项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33999868/

相关文章:

Arduino SoftwareSerial类的C++继承

c++11 - Centos7 和 devtoolset-7 下对 std::__sso_string::__sso_string 的 undefined reference

c++ - 使用 std::call_once 抛出异常的错误

c++ - 如何将此 C 代码转换为 C++?

python - 将字符串转换为嵌套元组 : Python

c++ - Cocos2d-x CCSprite内存使用(释放CCSprite)

c++ - 自动类型默认为 int 而不是 long

c++ - c++中的变体成员是什么?

python - 不同数据框列中的 zip 列表元素

c++ - 元组和压缩对有什么区别?