如何按类型从std::元组中获取元素
How to get element from std::tuple by type
我有一组类a, B, C,我想从泛型代码中按类型访问它们的实例,f.e
template<typename T>
newObject()
{
return m_storage->getNew();
}
其中m_storage是A或B或C的实例,取决于t
所以我想到了std::tuple,但有一个问题,因为我不能从元组中按类型获取元素。
std::tuple<A,B,C> m_tpl;
template<typename T>
newObject()
{
return m_tpl.get<T>().getNew();
}
有办法吗?这可能吗?
谢谢。
PS:我不想为每种类型编写newObject的专门化:-)
这是c++ 14关于按类型从tuple中获取值的草稿。
但是在c++ 14出现之前,你可以这样写:
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;
}
一个简单的可变混合容器就能做到这一点:
template < typename T > struct type_tuple_value
{
T value;
type_tuple_value ( T&& arg ) : value(std::forward<T>(arg)) {}
};
template < typename ...T > struct type_tuple : type_tuple_value<T>...
{
template < typename ...Args > type_tuple ( Args&&... args ) :
type_tuple_value<T>(std::forward<T>(args))... {}
template < typename U > U& get() { return type_tuple_value<U>::value; }
template < typename U > const U& get() const { return type_tuple_value<U>::value; }
};
示例如果你不喜欢模板,也可以使用constexpr函数来计算类型的位置。
constexpr int count_first_falses() { return 0; }
template <typename... B>
constexpr int count_first_falses(bool b1, B... b)
{
if (b1) return 0;
else return 1 + count_first_falses(b...);
}
template <typename E, typename... T>
decltype(auto) tuple_get_by_type(const std::tuple<T...>& tuple)
{
return std::get<count_first_falses((std::is_same<T, E>::value)...)>(tuple);
}
相关文章:
- 在boost::hana中给定一个键元组,如何从映射中获取值元组
- 如何在编译器时动态获取元组内的变量类型C++?
- 如何获取元组的元素
- 编译按映射类型获取元素的映射错误元组
- 获取std ::元组元素作为std ::变体
- 获取对元组元素的引用
- 一种从元组/数组获取参数包的方法
- 完美地从 std::get 中获取元组值
- 获取继承基类类型的元组
- 如何从对象中获取对元组尾部的引用 std::tuple<Head,Tail...>
- 在参数包中获取函数指针的返回类型,并将其保存为与其他参数连接的元组
- 在运行时获取元组中索引的类型
- 通过使用structure的元素来获取一个结构数组
- 按类型获取元组元素(pre C++0x)
- 获取级联元组类型;组合result_of和tuple_cat
- 获取元组元素类型的索引?
- 如何通过地址获取元组中元素的索引
- 如何获取元组的一部分
- 获取std::元组的一部分
- c++ Boost元组.获取元素类型的元组