访问吸气剂的真实基础类型?

时间:2014-02-14 23:30:21

标签: c++ c++11 tuples metaprogramming typetraits

我知道吸气剂总体上很糟糕,但在这里,我只是用一个来说明一个更普遍的问题。

考虑以下课程:

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::decaystd::remove_reference也会删除原始引用。

编辑:我添加了一个构造函数来帮助测试。

EDIT2:为了澄清,我无法对T...进行操作:我只是根据吸气剂搜索元功能。

EDIT3:从类的外部,我不知道底层元组成员的名称(这里名为_data,但它可以是_tuple或其他)

EDIT4:作为一个例子,如果我们假设所有类型都不是引用/指针,则可以实现这一点:

1)创建一个元函数,它将递归执行getter直到它失败(因此元组大小N将被知道)

2)对std::decaystd::get返回0并将它们放在一起的每种类型执行N

但如果其中一个元组元素是引用或指针,它将失败...

EDIT5:我将尽快发布EDIT4的实现(我正在研究)

EDIT6:这不是XY问题。我试图回答的基本问题是:

考虑一个名为Tuple_like的概念,其唯一条件是拥有像这里一样的模板化get成员。问题是:从这个唯一的函数get<I>(),是否可以提取有关基础元组的所有信息?

1 个答案:

答案 0 :(得分:2)

不,std::get<I>(some_tuple&)是有损的。它为引用和值类型返回相同的类型。如果有办法对get进行rvalue合格调用,你可以这样做。

嗯,my_tuple类型本身有模式匹配。如果您知道std::tuple字段的名称(或者甚至包含所有可能名称的列表),则存在违反隐私的方法,这可能在此处起作用。但我怀疑那些被排除在外。