2010-03-10 55 views
2

我需要創建一個映射,從整數到元組集合,單個集合中的元組具有相同的大小。問題在於元組的大小及其參數類型可以在運行時確定,而不是編譯時間。我想像的是這樣的:未知大小/參數類型的元組

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

但不能確切地知道如何正確地做到這一點,老實說使用指針。

這樣做的目的是創建臨時關係(表),每個關係具有唯一的標識符(鍵),也許您有另一種方法。

+0

請澄清:一組只做同樣大小的店面元組,但不同的集合可以有不同的元組大小? – 2010-03-10 12:10:01

+0

是的,一組只存儲相同大小的元組,但不同的組可以有不同的元組大小。 – myahya 2010-03-10 12:11:36

+0

您是否想在編譯時對所有具有相同大小的元組進行限制?此外,元組可以是任何類型的,其中一個元組具有相同類型的數據? – mukeshkumar 2010-03-10 12:45:00

回答

4

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

我只是插入整數

那麼你應該使用map< int, set< vector<int> > >。 (如果我是你,我會拋出一些typedef s)

回答最初的問題,但是,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; 
0

如果您有一些共同的基類,那麼您只能將這些不同的集合存儲在同一個集合中。你可以編寫一個抽象接口,然後爲每種表/元組實現它。問題是,通常這樣的接口往往非常混亂,如果你有很多類型的表/元組,你可能會發生類爆炸。 Boost.Any可能對這樣的接口有用(因爲你必須動態地處理不同的數據類型)。

0

如果該參數的類型有一些共同點,捕捉到一個抽象基類,使元組包含指向這個基類:

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; 

如果參數類型沒有共同之處 - 不要將它們放在同一個映射中。很可能他們不屬於一起。

1

作爲現代側面說明(如以前的答案是大約2010),今天的可變參數模板將是這個有用:

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