有没有办法在没有参数的情况下在其函数中获取数组结构的索引?
Posted
技术标签:
【中文标题】有没有办法在没有参数的情况下在其函数中获取数组结构的索引?【英文标题】:Is there a way to get the index of an array struct in its function without parameters? 【发布时间】:2022-01-06 10:23:48 【问题描述】:正如标题所说,在 Request() 中没有任何附加参数,同时保持干净。下面是一个例子:
struct CPerson
void Request();
void CPerson::Request()
// get index
/* EXAMPLES
serverinfo* info;
server.GetInfo(&info, index);
cout << info.username << "\n";
*/
CPerson person[64];
int main()
for (int i = 0; i < 64; i++)
person[i].Request(); // i = current index
return 0;
编辑:固定标题
【问题讨论】:
this - person
?不过看起来很丑陋。
您是否要从CPerson::Request()
中找出this
在person
中的位置?
如果“我自己的索引”是 CPerson
应该知道的,那么它应该有一个存储该信息的成员。
你为什么需要那个? i
是索引。当你做 person[42] = person[0];
时你想发生什么?
@FrançoisAndrieux 但这是唯一有意义的方法。让一个对象弄清楚它在数组中的位置是一个混乱的设计,当您创建不在数组中的该类的对象时,它没有任何意义。 OPs 问题(如果这是他遇到的问题,因为我不清楚)是该课程之外的问题,甚至与该课程无关。
【参考方案1】:
在这种特定情况下,只要你能保证CPerson
只存储在这个数组中,你就可以使用std::distance()
来获取索引,因为this
恰好是一个有效的数组迭代器.
这实际上与执行 this - person
相同,但标准库实现可以(并且经常这样做)在调试版本中具有额外的安全网,而不会为发布版本带来性能成本。
即使有额外的安全性,手动错误检查以验证this
是person
的一部分的假设仍然是一个好主意。为此,您需要使用std::less
(与关系运算符相反),因为即使对于不在数组内的指针,它也保证全局有效。
// C++11 and up.
#include <iterator>
#include <stdexcept>
struct CPerson
void Request();
;
CPerson person[64];
void CPerson::Request()
// possibly an assert() instead...
if(std::less<CPerson*>(this, std::begin(person)) ||
!std::less<CPerson*>(this, std::end(person)))
throw std::out_of_range("not part of person");
std::size_t index = std::distance(std::begin(person), this);
在 C++20 中,您可以更加通用,这将使 person
成为任何连续范围,例如 std::vector
:
// C++20 and up.
#include <ranges>
#include <stdexcept>
#include <vector>
struct CPerson
std::size_t Index() const;
void Request();
;
CPerson person[64];
// Or possibly
// std::vector<CPerson> person;
std::size_t CPerson::Index() const
static_assert(std::ranges::contiguous_range<decltype(person)>);
const CPerson* person_b = std::to_address(std::ranges::begin(person));
const CPerson* person_e = std::to_address(std::ranges::end(person));
if(std::less(this, person_b) ||
!std::less(this, person_e))
throw std::out_of_range("not part of person");
return std::distance(person_b, this);
void CPerson::Request()
auto i = Index();
【讨论】:
如果CPerson
具有私有构造函数和析构函数并将数组本身作为私有静态成员进行管理,以确保数组外的对象永远不会存在,这可能会更安全。
当this
和std::begin(person)
不是指向同一个数组的指针时,通过>=
的比较可以返回true
或false
,afaik 它甚至不必在@ 之间保持一致987654338@ 和<
。最好使用std::less
来比较它们
@Frank 我注意到了,谢谢。以上是关于有没有办法在没有参数的情况下在其函数中获取数组结构的索引?的主要内容,如果未能解决你的问题,请参考以下文章
在 PHP 5.3 中,如何在没有严格警告的情况下在一行中获取单个元素数组中的值
有没有办法在不使用(MFC)动态对象创建的情况下在 CSplitterWnd 中创建视图?
如何在没有 ajax 调用的情况下在 window.location 中传递一个数组