首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何找到对象由哪些类型组成?

如何找到对象由哪些类型组成?
EN

Stack Overflow用户
提问于 2011-08-10 15:18:35
回答 1查看 250关注 0票数 0

好的,昨天我发布了几乎相同的问题这里,但我无法修改答案(工作),以满足我的需要.我不想搞乱另一个话题,所以我开始了一个新的话题。

所以,我有两个(实际上大约有15个)结构,它可以组成一个对象。

代码语言:javascript
运行
复制
class MyBase{};

template <typename Super, typename T1, typename T2> 
struct A : public Super 
{
    void doStuffA() { cout<<"doing something in A"; }
};

template <typename Super, typename T1, typename T2> 
struct B : public Super 
{
    void doStuffB() { cout<<"doing something in B"; }
};

那我就有:

代码语言:javascript
运行
复制
template <typename ComposedType, typename T1, typename T2>
class Combined
{
    ComposedType m_cT;
public:
    Combined(const ComposedType & c) : m_cT(c) { }

    typedef A<null, T1, T2> anull;
    typedef B<null, T1, T2> bnull;

    void update()
    {
        typedef typename split<ComposedType>::Ct Ct;
        typedef typename split<ComposedType>::At At;

        //this I want 
        if( composed of A ) 
            m_cT.doStuffA();

        if( composed of B ) 
            m_cT.doStuffB();
    }
};

我想用它就像:

代码语言:javascript
运行
复制
int main()
{
    typedef A<B<MyBase,int,int>,int,int> ComposedType1;
    typedef B<MyBase,int,int> ComposedType2;

    ComposedType1 ct1;
    ComposedType2 ct2;

    Combined<ComposedType1, int, int> cb1(ct1);
    cb1.update();

    Combined<ComposedType2, int, int> cb2(ct2);
    cb2.update();
}

(例如,ints只是目的)

所以我有一些模板魔法:

代码语言:javascript
运行
复制
struct null{};

template<typename> 
struct split
{
    typedef null Ct;
    typedef null At;
};

template<template<typename> class C, typename T> 
struct split<C<T> >
{
    typedef C<null> Ct; //class template 
    typedef T      At;  //argument type
};

template<template<typename> class C> 
struct split<C<MyBase> >
{
    typedef C<null> Ct; //class template 
    typedef MyBase   At;  //argument type
};

但我做不到。

我知道有很多代码,但实际上这是一个很小的例子.我已经将这段代码发布到意为上,以便更好地阅读。

谢谢!

编辑:(在评论中提问)

我正在为AI建立系统,并希望在编译时尽可能多地解决问题。在这种情况下,我正在为运动行为建立系统。我的代码提供了许多类型的行为,如“转到点”、“逃避”、“避免障碍”等。在上面提到的例子中,这种行为被称为a、B。这些行为都有类似于"performBehavior“的方法,其返回类型可以与其他"performBehavior”组合。

因此,我想在编译时将特定的行为组合起来。例如:只有A或A+C+D+F等..。

然后在我的更新中做如下的事情:

如果行为由“转到点”组成,而不是"performBehaviorGoTo“

如果行为包括“逃避”,而不是"performBehaviorEvade“

..。

这是非常简短的解释,但希望我已经说明了我的观点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-10 15:33:35

您可以在函数重载时这样做:

代码语言:javascript
运行
复制
template <typename Super, typename T1, typename T2> 
void doStuff(A<Super, T1, T2>& a) { a.doStaffA(); }

template <typename Super, typename T1, typename T2> 
void doStuff(B<Super, T1, T2>& b) { b.doStaffB(); }

然后:

代码语言:javascript
运行
复制
// ...
void update()
{
    //this I want 
    //if( composed of A ) 
    //    m_cT.doStuffA();
    //if( composed of B ) 
    //    m_cT.doStuffB();

    doStuff(m_cT);
}

目前尚不清楚,您是否希望链接A<B<...> >调用。如果你这样做了,那么下面这样的事情就会发生:

代码语言:javascript
运行
复制
template <class T> 
void doStuff(T&) { /* do nothing */ }

template <typename Super, typename T1, typename T2> 
void doStuff(A<Super, T1, T2>& a) { 
    a.doStaffA(); 
    doStuff(static_cast<Super&>(a)); 
}

template <typename Super, typename T1, typename T2> 
void doStuff(B<Super, T1, T2>& b) { 
    b.doStaffB(); 
    doStuff(static_cast<Super&>(b)); 
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7013286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档