有没有一种方法可以识别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;
}

这应该从MyClass创建一个具有模板TYPEOtherClass,并将其复制到resulted_class中。

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

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

是:

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

不计算decltype内部的表达式。事实上,您不需要一个实例:

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

参见std::decaydecltypestd::declval

最新更新