c++ - 有没有办法在 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;
}
这应该创建一个OtherClass
with 模板并将其复制TYPE
到.MyClass
resulted_class
现在的问题。是否有可能实现相同但没有对索引值 0 或任何特定索引值的 [] 运算符的通用调用?关键是不能保证 operator [] 是为特定值定义的。TYPE
如果可能,我们只需要提取。
换句话说,如果我们使用一个类,std::vector<double>
我们想double
从该类中提取它。但在没有进一步了解的情况下std::vector
。我们唯一知道的是其中有一个 [] 运算符的定义。
解决方案
是的:
using T = std::decay_t<decltype(myclass[0])>;
里面的表达式decltype
不被计算。实际上,您不需要实例:
using T = std::decay_t<decltype(std::declval<MyClass>()[0])>;
推荐阅读
- ruby-on-rails - 当角色名称需要匹配 role_id 时,添加角色选择以设计注册表单(使用设计)
- html - 如何使用 filterPredicate 忽略对空/未定义字段的过滤
- kubernetes - Openshift中的Hazelcast发现:路由器IP的连接重置警告
- r - 在 R 中连接 2 个数据帧
- google-cloud-platform - 用于 pubsub 主题的 setIamPolicy(在资源级别而不是项目)
- wso2 - 重新创建租户时出现 Wso2 问题(创建已删除的租户)。如果我重新启动 wso2 服务器,我可以按预期在 wso2 上创建租户
- java - Volley 库在发布请求时给出错误 500
- pandas - 熊猫数据框中 NaN 和 0 的模棱两可的行为
- ios - SwiftUI - 使用 SwiftUI 创建一条虚线
- ruby-on-rails - Rails 6 `protect_from_forgery with: :null_session` 不起作用