c ++ boost :: any在不知道类型的情况下使用该值

时间:2013-06-04 12:23:43

标签: c++ class pointers

我使用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());
        }
    }
}

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

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

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

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

或者因为你已经使用了模板,所以静态多态可能是合适的。

或者可以将boost::any pointer_to_the_function;替换为boost::function<???> pointer_to_the_function;