请问高手关于C++的template和boost

superspring 2009-06-21 05:20:58
我需要编写下面着一个template


template <typename CONTAINER>
void populateData(CONTAINER& container, size_t count)
{}


但是问题是不知道 CONTAINER 是什么

container可能是 vector<boost::tuple<int, double>>,
也可能是vector<boost::tuple<int, double, double>>,也可能是其他

这种情况怎么办?怎么知道传进来的container到底是什么类型,

谢谢了

...全文
188 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
superspring 2009-06-23
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 xuhb95083023 的回复:]
container是什么类型不要紧,关键他是一个通用的类型,有一些通用的方法和数据,这个是开发的时候就知道的,如果你都不知道这个通用类型包含了那些方法和数据,那还写什么泛型函数
[/Quote]

楼主说的是

superspring 2009-06-23
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 yshuise 的回复:]
函数重载:
void populateData(vector <boost::tuple <int, double>>& container, size_t count)
{}
void populateData(vector <boost::tuple <int, double, double>>&container, size_t count)
{}
类特化:
using namespace boost;
template <typename T>
struct Data{
void populateData(T& container,size_t count){}
};

template <>
struct Data <vector <tuple <int,double> >{
static void populateDat…
[/Quote]

没错基本就是这样了。
xuhb95083023 2009-06-22
  • 打赏
  • 举报
回复
container是什么类型不要紧,关键他是一个通用的类型,有一些通用的方法和数据,这个是开发的时候就知道的,如果你都不知道这个通用类型包含了那些方法和数据,那还写什么泛型函数
ysysbaobei 2009-06-22
  • 打赏
  • 举报
回复
顶下
yshuise 2009-06-22
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 taodm 的回复:]
楼主啊,你能不能说说“container到底是什么类型”对你有什么影响啊?
[/Quote]
taodm就是本标准,不清楚的都可以问他。
taodm 2009-06-22
  • 打赏
  • 举报
回复
楼主啊,你能不能说说“container到底是什么类型”对你有什么影响啊?
yshuise 2009-06-22
  • 打赏
  • 举报
回复
函数重载:
void populateData(vector <boost::tuple <int, double>>& container, size_t count)
{}
void populateData(vector <boost::tuple <int, double, double>>&container, size_t count)
{}

类特化:
using namespace boost;
template <typename T>
struct Data{
void populateData(T& container,size_t count){}
};


template <>
struct Data <vector <tuple <int,double> >{
static void populateData(vector <tuple <int, double>>& container, size_t count)
{}
};

template <>
struct Data <vector <tuple <int, double, double>>>{
static void populateData(vector <tuple <int, double, double>>& container, size_t count){}
};
yshuise 2009-06-22
  • 打赏
  • 举报
回复
//函数重载:
void populateData(vector <boost::tuple <int, double>>& container, size_t count)
{}
void populateData(vector <boost::tuple <int, double, double>>&container, size_t count)
{}
//类特化:
using namespace boost;
template <typename T>
struct Data{
void populateData(T& container,size_t count){}
};

template <>
struct Data <vector <tuple <int,double> >{
static void populateData(vector <tuple <int, double>>& container, size_t count)
{}
};

template <>
struct Data <vector <tuple <int, double, double>>>{
static void populateData(vector <tuple <int, double, double>>& container, size_t count){}
};
yshuise 2009-06-22
  • 打赏
  • 举报
回复
函数重载:
void populateData(vector <boost::tuple <int, double>>& container, size_t count)
{}
void populateData(vector <boost::tuple <int, double, double>>&container, size_t count)
{}

类特化:
using namespace boost;
template<typename T>
struct Data{
void populateData(T& container,size_t count){}
};

template<>
struct Data<vector<tuple<int,double> >{
static void populateData(vector <tuple <int, double>>& container, size_t count)
{}
};

template<>
struct Data<vector <tuple <int, double, double>>>{
static void populateData(vector<tuple <int, double, double>>& container, size_t count){}
};
lambert_s 2009-06-21
  • 打赏
  • 举报
回复
学习
pathuang68 2009-06-21
  • 打赏
  • 举报
回复
superspring 2009-06-21
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 Demon__Hunter 的回复:]
container可能是 vector <boost::tuple <int, double>>,
也可能是vector <boost::tuple <int, double, double>>,也可能是其他
如果container得类型是有限得,那么直接将
template <typename CONTAINER>
void populateData(CONTAINER& container, size_t count)
{}
这个函数对vector <boost::tuple <int, double>>, vector <boost::tuple <int, double, double>>,等特化处理不就行了吗。

[/Quote]

你的意思是 C++没有办法写一个很 高 概括性的 void populateData(CONTAINER& container, size_t count)

可以处理任何 container
机智的呆呆 2009-06-21
  • 打赏
  • 举报
回复
container可能是 vector <boost::tuple <int, double>>,
也可能是vector <boost::tuple <int, double, double>>,也可能是其他
如果container得类型是有限得,那么直接将
template <typename CONTAINER>
void populateData(CONTAINER& container, size_t count)
{}
这个函数对vector <boost::tuple <int, double>>, vector <boost::tuple <int, double, double>>,等特化处理不就行了吗。
yshuise 2009-06-21
  • 打赏
  • 举报
回复
函数重载。
void populateData(vector <boost::tuple <int, double>>& container, size_t count)
{}
void populateData(vector <boost::tuple <int, double, double>>,container, size_t count)
{}


「已注销」 2009-06-21
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 superspring 的回复:]
引用 9 楼 Loaden 的回复:
你想知道name()的全称,比如现在输出i,但你想得到的是int?
那只能你自己建立一个反射表:让i对应int,用map去做了。



说实话不是完全理解你说的

但是这个map得多大啊。。。。。。
[/Quote]
楼主你这个问题的意义?
因为类型是无穷尽的(通过typedef),所以只能对一些典型类型进行反射。
目前C++语法,是无法得到任何类型的原名称的。
superspring 2009-06-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 Loaden 的回复:]
你想知道name()的全称,比如现在输出i,但你想得到的是int?
那只能你自己建立一个反射表:让i对应int,用map去做了。
[/Quote]

说实话不是完全理解你说的

但是这个map得多大啊。。。。。。

superspring 2009-06-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 Loaden 的回复:]
引用 5 楼 superspring 的回复:
但是问题是我要写一个 template,populateData里面应该是要知道container的结构的吧

这个交给编译器推导
[/Quote]

能不能具体点啊。。。。。。具体要怎么做,给我点线索,
「已注销」 2009-06-21
  • 打赏
  • 举报
回复
你想知道name()的全称,比如现在输出i,但你想得到的是int?
那只能你自己建立一个反射表:让i对应int,用map去做了。
hhyttppd 2009-06-21
  • 打赏
  • 举报
回复
呵呵,或者C++应该添加如C#的接口约束一类的关键字(class A<T> where T: new())。目前还是只要靠自己把握,模拟类型反射真是不那么好干的。
superspring 2009-06-21
  • 打赏
  • 举报
回复
你的意思是用 typeid().name() 知道type的名字

然后对type的结构进行分解?

这不太可行啊

因为container所包含的东西可能很复杂,根本不可能去这样解析

[Quote=引用 4 楼 Loaden 的回复:]
给你一个例子:
C/C++ code#include<iostream>#include<typeinfo>usingnamespacestd;

template<typename T>voidfun(T a)
{
cout<<typeid(T).name()<<endl;

}intmain()
{inta;charb;doublec;

fun(a);//输出I 说明是int 型fun(b);//输出 c说明是char 型fun(c);//输出 d说明是 double 型return0;
}
输出:
i
c
d
分别代表int、char、double
[/Quote]
加载更多回复(5)

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧