【问题标题】:c++ boost::any using the value without knowing the typec++ boost::any 在不知道类型的情况下使用该值
【发布时间】:2013-06-04 12:23:42
【问题描述】:

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

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

【问题讨论】:

  • 答案是否定的。但是你的问题不是最好用多态来解决吗(只是一个想法,因为我对实际情况知之甚少)?

标签: c++ class pointers


【解决方案1】:

您可以将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);

【讨论】:

  • 看起来很不错。当我尝试包含适当的 hpp 时,我真的不知道应该包含哪一个以获得相同的结果。在 我有 function1.hpp function2.hpp .... 你能告诉我应该使用哪一个吗?
  • @DarlekSupreme #include &lt;boost/function.hpp&gt;
  • 我没有,我只有function0.hpp。这是我的错吗?
  • @DarlekSupreme functionN.hpp 是采用 N 个参数的 boost::function 的版本。但是function.hpp应该在你的boost目录中(不在boost/function中)
  • 抱歉通知晚了。我试过你的解决方案。它对我来说没有正常工作,它给出了一堆错误。我想这是我的错,因为这是另一个主题,所以我将发布与此问题相关的问题。但无论如何我认为这个解决方案应该可以正常工作。
【解决方案2】:

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

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

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

或者也许用boost::function&lt;???&gt; pointer_to_the_function;替换boost::any pointer_to_the_function;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-18
    • 2016-01-13
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多