c++ - 访问 getter 的真正底层类型?

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

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

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

EDIT2:为澄清起见,我无法对 T... 进行操作: 我正在搜索仅基于 getter 的元函数。

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

EDIT4:举个例子,如果我们假设所有类型都不是引用/指针,则可以通过以下方式实现:

1) 制作一个将递归执行 getter 直到失败的元函数(因此元组大小 N 将是已知的)

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

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

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/

相关文章:

c# - .NET 4.7 返回元组和可为 null 的值

c++ - C++ 中 CPU 使用率降低 : declaring as unsigned int or not?

c++ - 为什么可以在没有类实例的情况下在编译时访问非常量、非静态成员?

pointers - C++ 11-一直使用nullptr吗?

c++ - 推断可变模板参数包元素的类型

python - 为什么我的嵌套 python 类实例变成了元组?

c++ - 通过命令行参数传递文件名与在代码中使用字符串文字

c++ - 调用 va_start 是否需要带有可变参数的函数?

c++ - 初始化大型静态类数组

python - ast.literal_eval - 遍历列表中的字符串元素