我知道 setter/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);}
};
考虑到我不能修改这个类。
有没有办法,写一个外部元函数my_tuple_type
(我所说的外部是指不属于该类的元函数)实际获取底层元组的类型? (我倾向于认为如果 T...
之一是引用是不可能的,因为仅在 get 返回的类型上应用 std::decay
或 std::remove_reference
也会删除原始引用)。
编辑:我添加了一个构造函数来帮助测试。
EDIT2:为澄清起见,我无法对 T...
进行操作: 我正在搜索仅基于 getter 的元函数。
EDIT3:从类的外部来看,我不知道底层元组成员的名称(这里它被命名为 _data
,但它可能是 _tuple
或其他)
EDIT4:举个例子,如果我们假设所有类型都不是引用/指针,则可以通过以下方式实现:
1) 制作一个将递归执行 getter 直到失败的元函数(因此元组大小 N 将是已知的)
2) 执行 std::decay
在 std::get
返回的每种类型上来自 0
至 N
并将它们放在一起。
但如果其中一个元组元素是引用或指针,它将失败...
EDIT5:我将很快发布 EDIT4 的实现(我正在努力)
EDIT6:这不是 XY 问题。我试图回答的基本问题是:
考虑一个名为 Tuple_like
的概念其唯一条件是拥有像此处这样的模板化 get 成员。问题是:从这个唯一的功能 get<I>()
, 是否可以提取底层元组的所有信息?
最佳答案
不,std::get<I>(some_tuple&)
是有损的。它为引用和值类型返回相同的类型。如果有一种方法可以对 get
进行右值限定调用你可以做到。
嗯,my_tuple
上有模式匹配自己打字。如果你知道 std::tuple
的名字字段(或什至有所有可能名称的列表)有侵犯隐私的方法,这可能在这里起作用。但我怀疑那些被排除在外。
关于c++ - 访问 getter 的真正底层类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21791328/