我知道吸气剂总体上很糟糕,但在这里,我只是用一个来说明一个更普遍的问题。
考虑以下课程:
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...
进行操作:我只是根据吸气剂搜索元功能。
EDIT3:从类的外部,我不知道底层元组成员的名称(这里名为_data
,但它可以是_tuple
或其他)
EDIT4:作为一个例子,如果我们假设所有类型都不是引用/指针,则可以实现这一点:
1)创建一个元函数,它将递归执行getter直到它失败(因此元组大小N将被知道)
2)对std::decay
从std::get
返回0
并将它们放在一起的每种类型执行N
。
但如果其中一个元组元素是引用或指针,它将失败...
EDIT5:我将尽快发布EDIT4的实现(我正在研究)
EDIT6:这不是XY问题。我试图回答的基本问题是:
考虑一个名为Tuple_like
的概念,其唯一条件是拥有像这里一样的模板化get成员。问题是:从这个唯一的函数get<I>()
,是否可以提取有关基础元组的所有信息?
答案 0 :(得分:2)
不,std::get<I>(some_tuple&)
是有损的。它为引用和值类型返回相同的类型。如果有办法对get
进行rvalue合格调用,你可以这样做。
嗯,my_tuple
类型本身有模式匹配。如果您知道std::tuple
字段的名称(或者甚至包含所有可能名称的列表),则存在违反隐私的方法,这可能在此处起作用。但我怀疑那些被排除在外。