我需要创建一个地图,从整数集合的元组的,在单组元组具有相同的大小。的问题是,一个元组和它的参数类型的大小可以被确定在运行时,不编译时间。我想象是这样的:

std::map<int, std::set<boost::tuple> >

但不exctly知道如何准确地做到这一点,bossibly使用指针。

这样做的目的是创建临时关系(表),每一个独特的标识符(密钥),你可以有另一种方法。

有帮助吗?

解决方案

boost::tuple的目的是任意的混合类型。如果像你说的,

  

我只插入整数

那么你应该使用map< int, set< vector< int > > >。 (如果我是你,我会扔在一些typedefs。)

要回答原来的问题,不过,boost::tuple不允许任意类型在运行时。 boost::any一样。然而,any不支持比较所以有更多一点的工作,如果你想在一个set使用它。

typedef vector< boost::any > tuple;
struct compare_tuple { bool operator()( tuple const &l, tuple const &r ) const {
    assert ( l.size() == r.size() );

    for ( tuple::iterator lit = l.begin(), rit = r.begin();
          lit != l.end(); ++ lit, ++ rit ) {
        assert ( lit->type() == rit->type() );

        if ( lit->type() == typeid( foo ) ) { // find the type and perform "<"
            return boost::any_cast<foo>(*lit) < boost::any_cast<foo>(*rit);
        } else if ( lit->type() == typeid( bar ) ) {
            return boost::any_cast<bar>(*lit) < boost::any_cast<bar>(*rit);
        } /* etc; you will need to enumerate all the types you can insert */
    }
} };

typedef std::map< int, std::set< tuple, compare_tuple > > main_map;

其他提示

作为现代侧面说明(如以前的答案是大约2010),今天的可变参数模板将是这个有用的:

template<typename... Args> //Accept any number of arguments and types
auto MyFunction(std::tuple<Args...> &T)->void
{
   //Do stuff...
}

如果您对他们有一些共同的基类,你只能存储相同的集合,这些不同的集合。你可以写一个抽象的接口,然后实现,对于每一种表/元组。问题是,通常这种界面往往是非常混乱的,你将可能有类爆炸,如果你有很多类型的表/元组。 Boost.Any 可能是这样的接口的(因为你必须动态地处理不同的数据类型)。

如果参数类型有共同之处,捕获到一个抽象基类,使所述元组包含指向该基类:

class MyParamBase {
public:
    virtual int getFoo() = 0;
    virtual void setFoo(int) = 0;
};

std::map<int, std::set<MyParamBase*> > container;

(升压::元组不再赘述。不知道为什么你需要一个元组集。)

可以然后从得出的MyParamBase具体参数类型和创建和它们插入图:

class SomeParam: MyParamBase {
public:
    virtual int getFoo() { ... }
    virtual void setFoo(int a) { ... }
};

std::set<MyParamBase*> some_set;
some_set.insert(new SomeParam());
container[123] = some_set;

如果参数类型没有任何共同之处 - 不要把它们放到同一个地图。很可能他们不属于一起。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top