求教,可变参数的问题

狼异族 2014-10-20 02:38:01
template <class TYPE>
class CTest
{
public:
CTest(...)
{
// 这里向TYPE(...)中传送CTest(...)中的参数
// m_ptr = new TYPE(...);
}
private:
TYPE *m_ptr;
};
问下,这个可以实现么?例如
CTest<int> a(10)
在CTest构造函数中就调用
m_ptr	= new TYPE(10);

...全文
244 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
max_min_ 2014-10-24
  • 打赏
  • 举报
回复
有源码的啊!看看printf函数
狼异族 2014-10-24
  • 打赏
  • 举报
回复
引用 14 楼 tab0tab 的回复:
不能这样写,写这样的代码,你写的时候节约了10分针,最后找bug会花上一星期。
这个如果在编译new TYPE()的时候做了类型检查,这样问题就不大了,只不过这个不知道怎么实现。ri_aje提到的variadic template貌似可行,C++11我也没研究过,不知道能否做类型检查,而且我这VC6.0连std都支持不好,更不要说C++11了。只能有时间在家里看看了。
幻夢之葉 2014-10-23
  • 打赏
  • 举报
回复
引用 16 楼 ri_aje 的回复:
[quote=引用 15 楼 jianwen0529 的回复:] [quote=引用 13 楼 ri_aje 的回复:] [quote=引用 11 楼 jianwen0529 的回复:] 结构跟类不都是类吗? 你既然要使用可变参数,自然是不能保证输入的类型是你所想的。//虽然有方法来确定类型的某些属性来排除? 可变参数本身就不是强类型检查的,正确性大多是由用户来控制而不是你这个接口编写者。 你需要判断确定类型又想放宽类型检查,本身是矛盾的! 如果你确定该接口都是使用自定义类型的话,你可以写个宏跟一个基类来生成一个类信息,用来判断参数的具体类型?!
这个说法不严谨,metaprogramming 里面大量依赖 sfinae 技术或 static_assert 的用例,对实例化类型增加限定条件是一个合理的并且有用的需求。[/quote] //虽然有方法来确定类型的某些属性来排除? 我有提到! 但是你想要的不是这样,你只能通过这些排除法来检查某类型能否符合你接下来的操作![/quote] 已经看不明白你在说什么了,不过没关系,我即不想要什么,楼主问的也不是这个,就不参与歪楼了。[/quote] 也许表达成为我的硬伤
mujiok2003 2014-10-23
  • 打赏
  • 举报
回复
引用 18 楼 bianfuba 的回复:
我这个可变参数的个数到是可以确定,但是类型没法确定,可能是结构或者类。
模板函数, 由编译器在type deduction的自行推演。
bianfuba 2014-10-23
  • 打赏
  • 举报
回复
我这个可变参数的个数到是可以确定,但是类型没法确定,可能是结构或者类。 为什么不用void * 呢?
bianfuba 2014-10-23
  • 打赏
  • 举报
回复
我这个可变参数的个数到是可以确定,但是类型没法确定,可能是结构或者类。
ri_aje 2014-10-22
  • 打赏
  • 举报
回复
引用 15 楼 jianwen0529 的回复:
[quote=引用 13 楼 ri_aje 的回复:] [quote=引用 11 楼 jianwen0529 的回复:] 结构跟类不都是类吗? 你既然要使用可变参数,自然是不能保证输入的类型是你所想的。//虽然有方法来确定类型的某些属性来排除? 可变参数本身就不是强类型检查的,正确性大多是由用户来控制而不是你这个接口编写者。 你需要判断确定类型又想放宽类型检查,本身是矛盾的! 如果你确定该接口都是使用自定义类型的话,你可以写个宏跟一个基类来生成一个类信息,用来判断参数的具体类型?!
这个说法不严谨,metaprogramming 里面大量依赖 sfinae 技术或 static_assert 的用例,对实例化类型增加限定条件是一个合理的并且有用的需求。[/quote] //虽然有方法来确定类型的某些属性来排除? 我有提到! 但是你想要的不是这样,你只能通过这些排除法来检查某类型能否符合你接下来的操作![/quote] 已经看不明白你在说什么了,不过没关系,我即不想要什么,楼主问的也不是这个,就不参与歪楼了。
ri_aje 2014-10-21
  • 打赏
  • 举报
回复
引用 11 楼 jianwen0529 的回复:
结构跟类不都是类吗? 你既然要使用可变参数,自然是不能保证输入的类型是你所想的。//虽然有方法来确定类型的某些属性来排除? 可变参数本身就不是强类型检查的,正确性大多是由用户来控制而不是你这个接口编写者。 你需要判断确定类型又想放宽类型检查,本身是矛盾的! 如果你确定该接口都是使用自定义类型的话,你可以写个宏跟一个基类来生成一个类信息,用来判断参数的具体类型?!
这个说法不严谨,metaprogramming 里面大量依赖 sfinae 技术或 static_assert 的用例,对实例化类型增加限定条件是一个合理的并且有用的需求。
ri_aje 2014-10-21
  • 打赏
  • 举报
回复
引用 9 楼 L812234929 的回复:
[quote=引用 8 楼 ri_aje 的回复:] 用 variadic template,像这样。

#include<utility>

template <typename T>
struct CTest
{
 template <typename ... Ts>
 CTest (Ts&& ... ts)
 {
  new T(std::forward<Ts>(ts)...);
 }
};
你这个好像可以,不过这个 variadic template是C++11里面才有吧[/quote] 是的,不过现在都 14 年底了,这个应该不是问题了吧。
幻夢之葉 2014-10-21
  • 打赏
  • 举报
回复
结构跟类不都是类吗? 你既然要使用可变参数,自然是不能保证输入的类型是你所想的。//虽然有方法来确定类型的某些属性来排除? 可变参数本身就不是强类型检查的,正确性大多是由用户来控制而不是你这个接口编写者。 你需要判断确定类型又想放宽类型检查,本身是矛盾的! 如果你确定该接口都是使用自定义类型的话,你可以写个宏跟一个基类来生成一个类信息,用来判断参数的具体类型?!
狼异族 2014-10-21
  • 打赏
  • 举报
回复
引用 5 楼 cs290473786 的回复:
搜个可变长参数的例子看看就懂了。
网上搜索到的都和printf差不多,需要确定可变参数个数及类型。我这个可变参数的个数到是可以确定,但是类型没法确定,可能是结构或者类。[/quote] 既然你可以确定参数个数,直接用模版就可以解决了。 template <class TYPE,class T1,class T2,class T3,class T4> class CTest { public: CTest(T1 d1,T2 d2,T3 d3,T4 d4) { //xxxx } private: TYPE *m_ptr; }; [/quote]这个我的表述有错误,我的意思是在一个特定的调用里面,我可以给CTest()传一个参数,表示有多少个变参,如CTest(int n, ...),而不是每次调用变参数量都是一样的。
狼异族 2014-10-21
  • 打赏
  • 举报
回复
引用 8 楼 ri_aje 的回复:
用 variadic template,像这样。

#include<utility>

template <typename T>
struct CTest
{
 template <typename ... Ts>
 CTest (Ts&& ... ts)
 {
  new T(std::forward<Ts>(ts)...);
 }
};
你这个好像可以,不过这个 variadic template是C++11里面才有吧
幻夢之葉 2014-10-21
  • 打赏
  • 举报
回复
引用 13 楼 ri_aje 的回复:
[quote=引用 11 楼 jianwen0529 的回复:] 结构跟类不都是类吗? 你既然要使用可变参数,自然是不能保证输入的类型是你所想的。//虽然有方法来确定类型的某些属性来排除? 可变参数本身就不是强类型检查的,正确性大多是由用户来控制而不是你这个接口编写者。 你需要判断确定类型又想放宽类型检查,本身是矛盾的! 如果你确定该接口都是使用自定义类型的话,你可以写个宏跟一个基类来生成一个类信息,用来判断参数的具体类型?!
这个说法不严谨,metaprogramming 里面大量依赖 sfinae 技术或 static_assert 的用例,对实例化类型增加限定条件是一个合理的并且有用的需求。[/quote] //虽然有方法来确定类型的某些属性来排除? 我有提到! 但是你想要的不是这样,你只能通过这些排除法来检查某类型能否符合你接下来的操作!
tab0tab 2014-10-21
  • 打赏
  • 举报
回复
不能这样写,写这样的代码,你写的时候节约了10分针,最后找bug会花上一星期。
ri_aje 2014-10-21
  • 打赏
  • 举报
回复
用 variadic template,像这样。

#include<utility>

template <typename T>
struct CTest
{
 template <typename ... Ts>
 CTest (Ts&& ... ts)
 {
  new T(std::forward<Ts>(ts)...);
 }
};
勤奋的小游侠 2014-10-20
  • 打赏
  • 举报
回复
引用 6 楼 L812234929 的回复:
引用 5 楼 cs290473786 的回复:
搜个可变长参数的例子看看就懂了。
网上搜索到的都和printf差不多,需要确定可变参数个数及类型。我这个可变参数的个数到是可以确定,但是类型没法确定,可能是结构或者类。
既然你可以确定参数个数,直接用模版就可以解决了。 template <class TYPE,class T1,class T2,class T3,class T4> class CTest { public: CTest(T1 d1,T2 d2,T3 d3,T4 d4) { //xxxx } private: TYPE *m_ptr; };
狼异族 2014-10-20
  • 打赏
  • 举报
回复
引用 5 楼 cs290473786 的回复:
搜个可变长参数的例子看看就懂了。
网上搜索到的都和printf差不多,需要确定可变参数个数及类型。我这个可变参数的个数到是可以确定,但是类型没法确定,可能是结构或者类。
Uron 2014-10-20
  • 打赏
  • 举报
回复
搜个可变长参数的例子看看就懂了。
狼异族 2014-10-20
  • 打赏
  • 举报
回复
引用 3 楼 xpdavis 的回复:
很简单啊,找个例子改改就行了 http://www.cnblogs.com/phinecos/archive/2007/08/24/868524.html
这个不行啊,TYPE(...)里面的参数类型可以任意类型的,比如结构、类。这篇文章中提到的跟printf函数差不多,需要指定可变参数的个数,以及每个参数的类型,而且类型还只能是固定的几种。
铖邑 2014-10-20
  • 打赏
  • 举报
回复
很简单啊,找个例子改改就行了 http://www.cnblogs.com/phinecos/archive/2007/08/24/868524.html
加载更多回复(2)

64,637

社区成员

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

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