我会建议你创建一个boost::tuple与财产地图和因素。
考虑到在您的上下文中,每个i都有(propertymap_i,weight_i),请求时创建一个使用此元组的聚合类(作为聚合类的模板参数)来计算所需的值。
您可以使用operator []或property map提供的get()函数。
如果需要,我可能会更清楚,但它必须等一下。
编辑:这是接近你所需要的吗?
#include <boost/graph/adjacency_list.hpp>
#include <iostream>
#include <boost/shared_ptr.hpp>
namespace property_aggregator
{
template<typename Tuple, typename T>
struct helper
{
double operator()(Tuple const& tuple, T t)
{
return boost::get<0>(tuple)*get(boost::get<1>(tuple), t) +
helper<typename Tuple::tail_type::tail_type, T>()(tuple.get_tail().get_tail(), t);
}
};
template<typename T>
struct helper<boost::tuples::null_type, T>
{
double operator()(boost::tuples::null_type const& tuple, T t)
{
return 0.;
}
};
template<typename T>
class BasePropertyAggregator
{
public:
virtual double compute(T t) = 0;
};
template <typename PropertyTuple, typename T>
class PropertyAggregator : public BasePropertyAggregator<T>
{
public:
PropertyAggregator(PropertyTuple const& tuple) : m_tuple(tuple){}
virtual ~PropertyAggregator(){}
double compute(T t)
{
return property_aggregator::helper<PropertyTuple, T>()(m_tuple, t);
}
private:
PropertyTuple m_tuple;
};
}
template<typename T>
class PropertyAggregator
{
public:
template<typename Tuple>
PropertyAggregator(Tuple const& tuple) : m_computer(new property_aggregator::PropertyAggregator<Tuple, T>(tuple))
{}
double operator()(T t)
{
return m_computer->compute(t);
}
private:
boost::shared_ptr<property_aggregator::BasePropertyAggregator<T> > m_computer;
};
// Defaut type of a graph
typedef boost::adjacency_list<boost::listS, boost::vecS, boost::directedS,
boost::property<boost::vertex_index_t, unsigned int>,
boost::property<boost::edge_weight_t, double,
boost::property<boost::edge_color_t, double> > > Graph;
int main()
{
typedef boost::property_map<Graph, boost::edge_weight_t>::type PM1;
typedef boost::property_map<Graph, boost::edge_color_t>::type PM2;
typedef boost::graph_traits<Graph>::edge_descriptor EdgeType;
Graph g;
PM1 pm1 = get(boost::edge_weight, g);
PM2 pm2 = get(boost::edge_color, g);
add_vertex(g);
add_vertex(g);
EdgeType edge1 = boost::add_edge(0, 1, g).first;
put(pm1, edge1, 1.);
put(pm2, edge1, 2.);
typedef PropertyAggregator<EdgeType> ComboType;
ComboType combo1(boost::make_tuple(1., pm1));
ComboType combo2(boost::make_tuple(1., pm2));
ComboType combo3(boost::make_tuple(1., pm1, 2., pm2));
std::cout << "-- " << combo1(edge1) << std::endl;
std::cout << "-- " << combo2(edge1) << std::endl;
std::cout << "-- " << combo3(edge1) << std::endl;
return 0;
}
我不确定我关注.. 。我需要存储包含元组的聚合类,但现在他们会有不同的模板参数,因此不兼容? – carlpett
在提炼我的答案之前,只是一个简单的问题:你是否定义了所有属性图都是相同类型的?我当然不是在谈论标签类型,而是底层类型。 –
是的,它们都是'boost :: property_map',其中'Graph'是一个固定的图形类型。 –
carlpett