2

我使用 boost::any 在不知道它们的类型的情况下成功保存了变量。但是我在徘徊是否可以在不将它们实际转换回原始类型的情况下使用它们。这是一个可以更好地描述问题的示例:

struct callbackInfo
{   
    boost::any pointer_to_the_object;
    boost::any pointer_to_the_function;
};


class someClass
{

    template<class T, class P>
    void add(T const func, P that)
    {
        callbackInfo tmp;
        tmp.pointer_to_the_object =that;
        tmp.pointer_to_the_function = func;
        functions->addLast(tmp);
    }

    template<class ARG>
    void trigger(SENDERTYPE sender, ARG arg)
    {
        STLinkedListIterator<callbackInfo>* it = functions->createIteator();
        if(it != nullptr)
        {
            do
            {           
                //This is the problem:
                ((*it->getData().pointer_to_the_object).*it->getData().pointer_to_the_function)(nullptr);
                it->next();
            }while(!it->EOL());
        }
    }
}

我想我已经知道答案是否定的,因为编译器无法检查变量的类型,但无论如何我问也许有一个天才的解决方案。

4

2 回答 2

3

您可以将其boost::any视为更安全的类型void*,它可以引用任何内容,但除非您知道它指的是什么并且可以正确地将其转换回来,否则您几乎无能为力。

因为你真正想要存储的是一个对象和一个指向成员函数的指针然后调用它,你不需要使用完全通用的boost::any,你可以创建一个调用包装器将这两个东西绑定在一起,然后使用允许的东西存储和调用一个函数,Boost 提供了你所需要的:

struct callbackInfo {
    boost::function<void(void*)> func;
};

template<class T, class P>
void add(T func, P that)
{
    callbackInfo tmp = { boost::bind(func, that, _1) };
    functions->addLast(tmp);
}

// ...

it->getData().func(nullptr);
于 2013-06-04T13:28:38.703 回答
1

实际上,没有。至少没有boost::any

但是请注意,您对类型进行了假设(一个是函数,另一个具有您使用的字段(此处不确定,此处代码不清楚)),因此您使用了多态性和类层次结构。

或者由于您已经使用模板,因此静态多态性可能是合适的。

或者也许替换boost::any pointer_to_the_function;boost::function<???> pointer_to_the_function;

于 2013-06-04T13:17:47.190 回答