【问题标题】:Accessing the real underlying type of a getter?访问 getter 的真正底层类型?
【发布时间】: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::decaystd::remove_reference 也会删除原始引用。

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

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

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

EDIT4:作为说明,如果我们假设所有类型都不是引用/指针,则可以通过以下方式实现:

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

2) 对std::get0N 返回的每个类型执行std::decay 并将它们放在一起。

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

EDIT5:我将很快发布 EDIT4 的实现(我正在努力)

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

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

【问题讨论】:

  • :( 那时我的所有技巧都不起作用。感谢您的澄清。
  • @dyp 您的 cmets 对更新有效吗? (EDIT2 和 EDIT3)?
  • 你怎么知道元组元素的个数?这是否也必须以某种方式从 getter 函数中提取出来?
  • 等等,所以您只想通过检查 size_t 和元组中的一种类型来了解元组的类型?
  • 你能扩展 EDIT2 吗?我还不相信这不是XY problem。您可能依赖get() 而不是实际类型my_tuple&lt;T...&gt;,这似乎很奇怪。

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


【解决方案1】:

不,std::get&lt;I&gt;(some_tuple&amp;) 是有损的。它为引用和值类型返回相同的类型。如果有办法对get 进行右值限定调用,您可以这样做。

嗯,my_tuple 类型本身有模式匹配。如果您知道std::tuple 字段的名称(或者甚至有所有可能名称的列表),那么有一些方法可以侵犯隐私,这可能在这里奏效。但我怀疑这些都被排除在外了。

【讨论】:

  • rvalue-ref-qualified get 真的足够了吗?你可以用它来区分 lvalue-refs 和 {rvalue-refs, non-refs},但你也可以用它来区分 rvalue-refs 和 non-refs 吗?我认为需要一个额外的const-qualified 版本才能做到这一点..
  • @dyp 不确定:我没有使用很多std::tuple&lt;foo&amp;&amp;&gt;:但是基于getthis 的右值引用将比constthis 方法的引用更加模糊无论如何。当我阅读这个问题时,两者都被排除在外(我只是在我们有 X/Y 的情况下提到它们)。
  • 可能无法通过 SFINAE 获取元组的大小,因为错误可能不会发生在 即时上下文中。至少,这是我的测试表明的。
  • This is what I have so far. 它仍然存在 size 问题,并且还没有区分 rvalue-refs 和 const-qualified non-refs。
猜你喜欢
  • 2021-04-22
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 2017-07-26
相关资源
最近更新 更多