【问题标题】:Is there a way how to identify class of overloaded operator[] in c++?有没有办法在 C++ 中识别重载运算符 [] 的类?
【发布时间】:2021-05-17 18:55:49
【问题描述】:

假设我们有一个带有运算符 [] 的类,如下所示

class MyClass
{
//...
public:
    TYPE operator[](const size_t idx) const
    {
        //... Implementation
    }
}

现在我想阅读TYPE 并将其用作另一个类的模板参数。一个人可能会使用技巧

template<class T>
class OtherClass
{
    //...
}

template<class T>
auto generator(const T& element)
{
    return OtherClass<T>(); 
} 

int main(void)
{
    MyClass myclass;
    auto resulted_class = generator(myclass[0]);
    return 0;
}

这应该从MyClass 创建一个带有模板TYPE 的OtherClass,并将其复制到resulted_class。

现在是问题。是否可以实现相同但没有对索引值 0 或任何特定索引值的 [] 运算符的通用调用?关键是不能保证 operator [] 是为特定值定义的。如果可能,我们只需要提取TYPE。

换句话说,如果我们使用像std::vector&lt;double&gt; 这样的类,我们希望从该类中提取double。但没有进一步了解std::vector。我们唯一知道的是,其中有一个 [] 运算符的定义。

【问题讨论】:

  • 是的(见答案),但请记住 std::vector 已经定义了 value_type。

标签: c++ templates types operator-overloading auto


【解决方案1】:

是的:

using T = std::decay_t<decltype(myclass[0])>;

decltype 内部的表达式不被计算。实际上,您不需要实例:

using T = std::decay_t<decltype(std::declval<MyClass>()[0])>;

见std::decay、decltype和std::declval

【讨论】:

  • 似乎即使只是初始化为 OtherClass()[0])> 结果类就足够了。即使没有 std::dacay 也可以。
  • @MarekBasovník 是的,当然。 using T = ... 只是获取类型的一个示例。你可以使用你喜欢的类型。这有点像使用表达式创建变量 vs 内联。
  • @MarekBasovník 它可以在没有std::decay 的情况下工作。但是对于std::vector 来说,类型将是double&amp; 或double const&amp;,而不仅仅是double。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多