首页 > 解决方案 > 有没有办法在 C++ 中识别重载运算符 [] 的类?

问题描述

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

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;
}

这应该创建一个OtherClasswith 模板并将其复制TYPE到.MyClassresulted_class

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

换句话说,如果我们使用一个类,std::vector<double>我们想double从该类中提取它。但在没有进一步了解的情况下std::vector。我们唯一知道的是其中有一个 [] 运算符的定义。

标签: c++templatestypesoperator-overloadingauto

解决方案


是的:

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

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

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

见和std::decay_decltypestd::declval


推荐阅读