歌詞:其中Boost :: Variant和function_types:如何將函數放入Boost :: variant?
我嘗試通過MPI實現任務池。所以,我需要某種形式的RPC,而是一個將我的程序的不同部分之間的工作,這意味着處理器A希望處理器B調用函數C與參數D.我們無法通過函數指針進程之間像我們做的線程,因此我們需要一些包裝容器來保存每個流程實例的函數指針。所有內部的源文件\一個程序...所以我開始想知道How to store functional objects with different signature in a container。我的API想法當時是錯誤的 - 最好是在該池構造中定義函數池中的所有函數(至少應該更容易實現)。但是,在實施我面對下一個麻煩:
問題:
這種簡單的代碼(function_types,mpl::vector,variant):
#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
我們看到:
這個代碼塊:
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.Any)。
我不太明白在連接到源代碼中的問題,但我想你真正想要的是一些進程間通信。我建議你看看Boost.Interprocess http://www.boost。org/doc/libs/1_48_0/doc/html/interprocess.html – mantler
@manler:進程間跨越一臺機器...... MPI跨越很多=) – myWallJSON
是的,使用'boost:bind()' – karlphillip