【发布时间】:2014-02-14 23:30:21
【问题描述】:
我知道 getter 通常不好,但在这里,我只是用一个来说明一个更普遍的问题。
考虑以下类:
template <class... T>
class my_tuple final
{
private:
std::tuple<T...> _data;
public:
template <class... U>
my_tuple(U&&... u)
: _data(std::forward<U>(u)...) {}
public:
template <std::size_t I>
auto get() -> decltype(std::get<I>(_data))
{return std::get<I>(_data);}
};
考虑到我不能修改这个类。
有没有办法编写一个 external 元函数my_tuple_type(外部我的意思是不属于该类的元函数)来实际获取底层元组的类型? (我倾向于认为如果 T... 之一是引用是不可能的,因为仅在 get 返回的类型上应用 std::decay 或 std::remove_reference 也会删除原始引用。
编辑:我添加了一个构造函数来帮助测试。
EDIT2:为澄清起见,我无法对 T... 进行操作:我正在搜索仅基于 getter 的元函数。
EDIT3:从类的外部,我不知道底层元组成员的名称(这里它被命名为_data,但它可能是_tuple 或其他)
EDIT4:作为说明,如果我们假设所有类型都不是引用/指针,则可以通过以下方式实现:
1) 创建一个元函数,它将递归执行 getter 直到它失败(因此元组大小 N 将是已知的)
2) 对std::get 从0 到N 返回的每个类型执行std::decay 并将它们放在一起。
但如果元组元素之一是引用或指针,它将失败......
EDIT5:我将很快发布 EDIT4 的实现(我正在努力)
EDIT6:这不是 XY 问题。我试图回答的基本问题是:
考虑一个名为Tuple_like 的概念,其唯一条件是拥有像这里这样的模板化 get 成员。问题是:从这个唯一的函数get<I>(),是否可以提取底层元组的所有信息?
【问题讨论】:
-
:( 那时我的所有技巧都不起作用。感谢您的澄清。
-
@dyp 您的 cmets 对更新有效吗? (EDIT2 和 EDIT3)?
-
你怎么知道元组元素的个数?这是否也必须以某种方式从 getter 函数中提取出来?
-
等等,所以您只想通过检查
size_t和元组中的一种类型来了解元组的类型? -
你能扩展 EDIT2 吗?我还不相信这不是XY problem。您可能依赖
get()而不是实际类型my_tuple<T...>,这似乎很奇怪。
标签: c++ c++11 tuples metaprogramming typetraits