我需要創建一個映射,從整數到元組集合,單個集合中的元組具有相同的大小。問題在於元組的大小及其參數類型可以在運行時確定,而不是編譯時間。我想像的是這樣的:未知大小/參數類型的元組
std::map<int, std::set<boost::tuple> >
但不能確切地知道如何正確地做到這一點,老實說使用指針。
這樣做的目的是創建臨時關係(表),每個關係具有唯一的標識符(鍵),也許您有另一種方法。
我需要創建一個映射,從整數到元組集合,單個集合中的元組具有相同的大小。問題在於元組的大小及其參數類型可以在運行時確定,而不是編譯時間。我想像的是這樣的:未知大小/參數類型的元組
std::map<int, std::set<boost::tuple> >
但不能確切地知道如何正確地做到這一點,老實說使用指針。
這樣做的目的是創建臨時關係(表),每個關係具有唯一的標識符(鍵),也許您有另一種方法。
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;
如果您有一些共同的基類,那麼您只能將這些不同的集合存儲在同一個集合中。你可以編寫一個抽象接口,然後爲每種表/元組實現它。問題是,通常這樣的接口往往非常混亂,如果你有很多類型的表/元組,你可能會發生類爆炸。 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;
如果參數類型沒有共同之處 - 不要將它們放在同一個映射中。很可能他們不屬於一起。
作爲現代側面說明(如以前的答案是大約2010),今天的可變參數模板將是這個有用:
template<typename... Args> //Accept any number of arguments and types
auto MyFunction(std::tuple<Args...> &T)->void
{
//Do stuff...
}
請澄清:一組只做同樣大小的店面元組,但不同的集合可以有不同的元組大小? – 2010-03-10 12:10:01
是的,一組只存儲相同大小的元組,但不同的組可以有不同的元組大小。 – myahya 2010-03-10 12:11:36
您是否想在編譯時對所有具有相同大小的元組進行限制?此外,元組可以是任何類型的,其中一個元組具有相同類型的數據? – mukeshkumar 2010-03-10 12:45:00