如何从std :: tuple的类型获取元素 [英] How to get element from std::tuple by type

查看:508
本文介绍了如何从std :: tuple的类型获取元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一组类A,B,C和我想要从类型的通用代码访问实例fe

  template< typename T> 
newObject()
{
return m_storage-> getNew();
}

其中m_storage是A或B或C的实例, / p>

所以我想出了std :: tuple,但是有一个问题,因为我不能从类型tuple获取元素。

  std :: tuple< A,B,C> m_tpl; 
template< typename T>
newObject()
{
return m_tpl.get< T>()。getNew();
}

有办法吗?

谢谢。



PS:
我不想为每个类型编写newObject的专业化: - )

解决方案

这篇文章是C ++ 14关于从类型获得值的草案。



但在C之前++ 14会来,你可以写如下:

 命名空间详细信息
{

template< class T,std :: size_t N,class ... Args>
struct get_number_of_element_from_tuple_by_type_impl
{
static constexpr auto value = N;
};

template< class T,std :: size_t N,class ... Args>
struct get_number_of_element_from_tuple_by_type_impl< T,N,T,Args ...>
{
static constexpr auto value = N;
};

template< class T,std :: size_t N,class U,class ... Args>
struct get_number_of_element_from_tuple_by_type_impl< T,N,U,Args>
{
static constexpr auto value = get_number_of_element_from_tuple_by_type_impl< T,N + 1,Args ...> :: value;
};

} //命名空间细节

模板< class T,class ... Args>
T get_element_by_type(const std :: tuple< Args ...>& t)
{
return std :: get< detail :: get_number_of_element_from_tuple_by_type_impl< T,0,Args .. 。> :: value>(t);
}

int main()
{
int a = 42;

auto t = std :: make_tuple(3.14,Hey!,std :: ref(a));

get_element_by_type< int&>(t)= 43;

std :: cout<< a<< std :: endl;

// get_element_by_type< char>(t); // tuple_element index out of range

return 0;
}


I have a set of classes A, B, C and I want to have access instances of them from generic code by type, f.e

template<typename T>
newObject()
{
    return m_storage->getNew();
}

where m_storage is instance of A or B or C, depends on T.

So I came up with std::tuple, but there is the problem because I can't get element from tuple by type.

std::tuple<A,B,C> m_tpl;
template<typename T>
newObject()
{
    return m_tpl.get<T>().getNew();
}

Is there any way to do it?Is this possible?

Thanks.

PS: I don't want to write the specialisation of newObject for each type.:-)

解决方案

This is a draft from C++14 about getting value from tuple by type.

But before C++14 will come, you could write something like below:

namespace detail
{

template <class T, std::size_t N, class... Args>
struct get_number_of_element_from_tuple_by_type_impl
{
    static constexpr auto value = N;
};

template <class T, std::size_t N, class... Args>
struct get_number_of_element_from_tuple_by_type_impl<T, N, T, Args...>
{
    static constexpr auto value = N;
};

template <class T, std::size_t N, class U, class... Args>
struct get_number_of_element_from_tuple_by_type_impl<T, N, U, Args...>
{
    static constexpr auto value = get_number_of_element_from_tuple_by_type_impl<T, N + 1, Args...>::value;
};

} // namespace detail

template <class T, class... Args>
T get_element_by_type(const std::tuple<Args...>& t)
{
    return std::get<detail::get_number_of_element_from_tuple_by_type_impl<T, 0, Args...>::value>(t);
}

int main()
{
    int a = 42;

    auto t = std::make_tuple(3.14, "Hey!", std::ref(a));

    get_element_by_type<int&>(t) = 43;

    std::cout << a << std::endl;

    // get_element_by_type<char>(t); // tuple_element index out of range

    return 0;
}

这篇关于如何从std :: tuple的类型获取元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆