迭代 std::list

发布于 2024-09-11 04:08:53 字数 594 浏览 5 评论 0原文

循环 std::list 时如何检查对象类型?

class A
{
    int x; int y;
public:
    A() {x = 1; y = 2;}
};

class B
{
    double x; double y;
public:
    B() {x = 1; y = 2;}
};

class C
{
    float x; float y;
public:
    C() {x = 1; y = 2;}
};

int main()
{
    A a; B b; C c;
    list <boost::variant<A, B, C>> l;
    l.push_back(a);
    l.push_back(b);
    l.push_back(c);

    list <boost::variant<A, B, C>>::iterator iter;

    for (iter = l.begin(); iter != l.end(); iter++)
    {
            //check for the object type, output data to stream
    }
}

How would you check for the object type when looping std::list?

class A
{
    int x; int y;
public:
    A() {x = 1; y = 2;}
};

class B
{
    double x; double y;
public:
    B() {x = 1; y = 2;}
};

class C
{
    float x; float y;
public:
    C() {x = 1; y = 2;}
};

int main()
{
    A a; B b; C c;
    list <boost::variant<A, B, C>> l;
    l.push_back(a);
    l.push_back(b);
    l.push_back(c);

    list <boost::variant<A, B, C>>::iterator iter;

    for (iter = l.begin(); iter != l.end(); iter++)
    {
            //check for the object type, output data to stream
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

ゞ花落谁相伴 2024-09-18 04:08:53

来自 boost 自己的示例:

void times_two( boost::variant< int, std::string > & operand )
{
    if ( int* pi = boost::get<int>( &operand ) )
        *pi *= 2;
    else if ( std::string* pstr = boost::get<std::string>( &operand ) )
        *pstr += *pstr;
}

即使用 get 将返回 T*。如果 T* 不是 nullptr,则变体的类型为 T

From boost's own example:

void times_two( boost::variant< int, std::string > & operand )
{
    if ( int* pi = boost::get<int>( &operand ) )
        *pi *= 2;
    else if ( std::string* pstr = boost::get<std::string>( &operand ) )
        *pstr += *pstr;
}

i.e. Using get<T> will return a T*. If T* is not nullptr, then the variant is of type T.

我家小可爱 2024-09-18 04:08:53

与确定常规变体类型的方式相同。

for (iter = l.begin(); iter != l.end(); iter++)
{
        //check for the object type, output data to stream
        if (A* a = boost::get<A>(&*iter)) {
            printf("%d, %d\n", a->x, a->y);
        } else ...
}

Same as how you determine the type from a regular variant.

for (iter = l.begin(); iter != l.end(); iter++)
{
        //check for the object type, output data to stream
        if (A* a = boost::get<A>(&*iter)) {
            printf("%d, %d\n", a->x, a->y);
        } else ...
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文