有没有办法在 C++ 中识别 class 的重载 operator[]?
Is there a way how to identify class of overloaded operator[] in c++?
假设我们有一个带有运算符 [] 的 class,如下所示
class MyClass
{
//...
public:
TYPE operator[](const size_t idx) const
{
//... Implementation
}
}
现在我想阅读 TYPE
并将其用作另一个 class 的模板参数。一个人可能会使用一招
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<double>
这样的 class,我们想从 class 中提取 double
。但是没有进一步了解 std::vector
。我们唯一知道的是里面有一个[]运算符的定义。
是:
using T = std::decay_t<decltype(myclass[0])>;
decltype
中的表达式未被计算。事实上,您不需要实例:
using T = std::decay_t<decltype(std::declval<MyClass>()[0])>;
见std::decay
, decltype
and std::declval
假设我们有一个带有运算符 [] 的 class,如下所示
class MyClass
{
//...
public:
TYPE operator[](const size_t idx) const
{
//... Implementation
}
}
现在我想阅读 TYPE
并将其用作另一个 class 的模板参数。一个人可能会使用一招
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<double>
这样的 class,我们想从 class 中提取 double
。但是没有进一步了解 std::vector
。我们唯一知道的是里面有一个[]运算符的定义。
是:
using T = std::decay_t<decltype(myclass[0])>;
decltype
中的表达式未被计算。事实上,您不需要实例:
using T = std::decay_t<decltype(std::declval<MyClass>()[0])>;
见std::decay
, decltype
and std::declval