如何从std :: tuple的类型获取元素 [英] How to get element from std::tuple by type
问题描述
我有一组类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会来,你可以写如下:
命名空间详细信息
{
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屋!