Boost :: Variant和function_types:如何将函数放入Boost :: variant中?

时间:2011-11-29 20:35:32

标签: c++ function boost function-pointers boost-variant

歌词:

我尝试在MPI上实现任务池。所以我需要某种RPC但是可以在我的程序的不同部分之间工作,这意味着处理器A希望处理器B用参数D调用函数C.我们不能像处理线程一样传递指针之间的函数,所以我们需要一些包装容器来保存每个流程实例的函数指针。所有内部源文件\一个程序...所以我开始想知道How to store functional objects with different signature in a container。那时我的API Idea是错误的 - 最好在该池构造中定义函数池中的所有函数(至少它应该更容易实现)。但在实施时我遇到了下一个麻烦:

问题:

这样简单的代码(function_typesmpl::vectorvariant):

#include <boost/function_types/function_type.hpp>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/vector_c.hpp>
#include <boost/variant.hpp>

#include <iostream>
#include <string>

template <class T>
int append(T val)
{
    std::cout << "hello";
    return 0;
}

int main()
{
    boost::variant<boost::function_types::function_type< boost::mpl::vector<int,int> >::type , boost::function_types::function_type< boost::mpl::vector<int,std::string> >::type  > a;
    return 0;
} 

不会编译下降:

Error   1   error C2066: cast to function type is illegal   c:\program files\boost\include\boost\variant\variant.hpp    1231    1

看着source我们看到了:

此代码块:

variant()
{
    // NOTE TO USER :
    // Compile error from here indicates that the first bound
    // type is not default-constructible, and so variant cannot
    // support its own default-construction.
    //
    new( storage_.address() ) internal_T0();
    indicate_which(0); // zero is the index of the first bounded type
}

所以我想知道:如何解决这个错误?

我也试过了:

#include <boost/function_types/function_type.hpp>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/vector_c.hpp>
#include <boost/variant.hpp>
#include <boost/function.hpp>

#include <iostream>
#include <string>

template <class T>
int append(T val)
{
    std::cout << "hello";
    return 1;
}

int main()
{
    boost::variant< boost::function<int (std::string) >, boost::function<int (int) > > a;
    a= &append<int>;

    return 0;
}

哪个失败了:

Error   1   error C2668: 'boost::detail::variant::make_initializer_node::apply<BaseIndexPair,Iterator>::initializer_node::initialize' : ambiguous call to overloaded function   c:\program files\boost\include\boost\variant\variant.hpp    1330

关于如何使boost.variant保持函数的任何想法?

当然,我们可以使用像这样的仿函数的共享指针:

#include <boost/variant.hpp>
#include <boost/shared_ptr.hpp>

#include <iostream>
#include <string>

template <class in, class out>
struct s_append
{
    out operator()(in val) {
        std::cout << "hello";
        return out();
    }
};

int main()
{
    boost::variant<boost::shared_ptr<s_append<int, int> >, boost::shared_ptr< s_append<std::string, int> > > a;
    boost::shared_ptr<s_append<int, int> > b(new s_append<int, int> );
    a=b;
    return 0;
}

并且它会编译但是结果API很糟糕 - 你必须1)为你想要使用的所有函数创建函子(意味着限制使用当前的进程范围); 2)使用shared_pointers,所以我甚至不知道如何以这种方式调用嵌套函数(简单的第一次猜测(*a)(22);只是不会编译=(并且API开始像我们使用Boost一样糟糕)。任何)。

1 个答案:

答案 0 :(得分:0)

尝试插入虚拟类型作为variant的第一个参数。正如您发现的注释所解释的那样,只有变体中的第一个类型用于变体自己的默认构造函数。您可以为此使用空结构类型(struct NoFunction {};)。

也就是说,你可能已经想到了将boost :: functions用作变体中的类型的想法......它们至少是默认构造的。我不确定你从这种方法中得到的另一个错误是由于,但只是想让你知道如果你不能使用我提到的虚拟类型的解决方法,你可以更多地追求这个角度。