【c++疑问】如何定义一个[模板类]类型的vector

坚持_执着 发布于 2014/03/26 12:05
阅读 1K+
收藏 1

hi 大家好:

如题描述,我定义了一个模板类:

template <class T>
class DictItem
{
public:
    int insert_elem(T t)
    {
        _elem_vec.push_back(t);
    }
private:
    char _item_type;
    std::vector<T> _elem_vec;
};

然后我想定义一个vector,存储DictItem,并且形参不固定,但是这样行不通,因为类模板的形参是运行时决定的。请问大家,这种情况如何实现?


补充说明一下,需求是这样的:

有一行数据,每一列是一个类型,例如:

1 1.2 google

2 2.3 facebook

像上面的数据,一共3列,分别是整型,浮点型,字符串类型,我想每个类型用一个DictItem来存储,并且每一行的所有DictItem存储在vector里。

加载中
0
z
zhoutianzuo

没有看懂,模板的参数是编译的时候确定的。

你就vector<DictItem<int> >,有什么问题?

坚持_执着
坚持_执着
抱歉,我没说清楚:) 是这样的:DictItem的形参可能为int,也可能为float,就是说,形参类型是不确定的,有办法将形参不同的DictItem,存储在一个vector里吗?
0
z
zhoutianzuo

那你搞复杂了,你为什么要分开存储呢?

直接做一个struct封装你要的数据,然后用vector存储这个struct就是了:

#include <vector>
using namespace std;

struct ItemType
{
    int index;
    double subIndex;
    string name;
};

typedef ItemType T;

class DictItem
{
public:
    int insert_elem(T t)
    {
        _elem_vec.push_back(t);
        return 1;
    }
private:
    char _item_type;
    std::vector<T> _elem_vec;
};

int main()
{
    DictItem aitem;
    return 0;
}



0
Danath
Danath

随手写段,没调试,应该是这个思路。

union Item
{
	int index;
	double subIndex;
	string name;
};

void set(Item& item, int& a)
{
	item.index = a;
}

void set(Item& item, double& a)
{
	item.subIndex = a;
}

void set(Item& item, string& a)
{
	item.name = a;
}

template <class T>
class DictItem
{
public:
    int insert_elem(T t)
    {
        Item e;
        set(e,t);
        _elem_vec.push_back(e);
    }
    
private:
    char _item_type;
    std::vector<Item> _elem_vec;
};



0
渡世白玉
渡世白玉

QVariant 和 boost::any

是你的需求、、

你可以看下他们的的实现、、

xu4v
xu4v
boost::any +1
0
zyh123101
zyh123101
#include <iostream>
#include <vector>
#include <typeinfo>

using namespace std;

class DictItem{
	struct Item{
		void *valp;
		string _item_type;
	}item;
	vector<Item> vec;
public:
	template<typename T>
	void insertItem(const T& val)  // 插入字符串时需显示说明类型,不能用类型推断
	{
		if(typeid(T) == typeid(char*))
			insertItem<string>(string(*(char**)(&val)));
		item.valp = (void*)(new T(val));
		item._item_type = string(typeid(T).name());
		vec.push_back(item);
	}

	void display() // 测试输出
	{
		for(auto it:vec) // C++11
		{
			if(it._item_type == string(typeid(int).name()))
				cout << *((int*)it.valp) << endl;
			else if(it._item_type == string(typeid(double).name()))
				cout << *((double*)it.valp) << endl;
			else if(it._item_type == string(typeid(string).name()))
				cout << *((string*)it.valp) << endl;
			else if(it._item_type == string(typeid(char).name()))
				cout << *((char*)it.valp) << endl;
		}
	}
};

int main()
{
	DictItem dictItem;
	dictItem.insertItem(35);
	dictItem.insertItem(45);
	dictItem.insertItem(42.30);
	dictItem.insertItem<string>("str");
	dictItem.insertItem('r');
	dictItem.insertItem<char*>("abcdef");
	dictItem.display();
    return 0;
}



返回顶部
顶部