限定类的<<操作符(函数模板)输入的为整数类型

moolleychean 2008-10-17 10:39:33
需要实现如下功能:
class A
{
public:
template <typename T>
A & operator<<(T rhs)
{
//some integral operation
}
};

int main(void)
{
A a;
a << 123; //Ok
a << 123.0/*或其他非整数类型*/; //编译失败,且错误信息指向本行
}

已经考虑过的方法如下:

1. 如果是想对类模板的参数限制类型,可以如下:
template <typename T, typename Enable = void>
class A;

template <typename T>
class A <T, typename boost::enable_if<boost::is_integral<T>>::type>
{
//
};
但函数模板无法偏特化,也不能指定默认模板参数。

2.如果普通函数,可以如下:
template <typename T>
std::auto_ptr<char> itoa(T value, int base, typename boost::enable_if<boost::is_integral<T>>::type * = 0)
{
//some integral operation
}
但operator<<不能提供额外的函数参数。

3.或者对于参数无法增加的函数,可以如下:
template<typename T>
typename boost::enable_if<boost::is_integral<T>>::type
itoa(T value, char * str, int base)
{
//some integral operation
}
但为了能够连续输入,形如:a << 123 << 456 << 789等,operator<<的返回值又必须为A &。

4. 参考VC的stl basic_ostream实现源码:
basic_ostreamt& operator<<(unsigned short _Val);
basic_ostream& operator<<(int _Val);
basic_ostream& operator<<(unsigned int _Val);
.....等等其他整数类型的重载函数(oh, my god)
......别扭

诸位大侠有没有高招?
...全文
158 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
moolleychean 2008-10-20
  • 打赏
  • 举报
回复
谢谢,要的就是这个,不过稍微改一下:
class A
{
public:
template <typename T>
typename boost::enable_if <boost::is_integral <T>, A/*T*/>::type & operator < <(T rhs)
{
}
};

看boost::enable_if的源码太粗心:
template <bool B, class T = void>
struct enable_if_c {
typedef T type;
};

template <class T>
struct enable_if_c<false, T> {};

template <class Cond, class T = void>
struct enable_if : public enable_if_c<Cond::value, T> {};
想当然的以为class T = void仅仅是一个类似于占位符的东东:当class Cond::value=false时定义了一个没有enable_if::type的类型,此时对enable_if::type的引用产生编译错误。

书当然要看,不过源码更要看,特别是boost的源码,两个字:艺术。

另:我的问题只是简单的实现限制模板参数,我觉得还扯不上高深的模板元编程的概念。在使用boost库之前,我自己写过限制模板参数类型的模板,只不过是用typedef void type来定义的类型,所以看boost源码后的第一感就是以为class T = void是一个占位符,也就没想到用它了。
taodm 2008-10-20
  • 打赏
  • 举报
回复
class A
{
public:
template <typename T>
typename boost::enable_if<boost::is_integral<T>, T>::type & operator <<(T rhs)
{
}
};
taodm 2008-10-18
  • 打赏
  • 举报
回复
模板元编程的知识不是靠到boost目录里找的。
是要看过《Modern C++ design》和《C++模板元编程》2本书掌握出来的。
moolleychean 2008-10-18
  • 打赏
  • 举报
回复
up
moolleychean 2008-10-17
  • 打赏
  • 举报
回复
可以介绍一下吗?
moolleychean 2008-10-17
  • 打赏
  • 举报
回复
谢谢,在boost1.36.0中未发现boost::select库,preprocess库我找找
taodm 2008-10-17
  • 打赏
  • 举报
回复
当然,模板元原编程库里自动代码生成机制里还有不少方法可以完成此功能。
taodm 2008-10-17
  • 打赏
  • 举报
回复
boost::select库和preprocess库应该都可以完成你要的功能。
moolleychean 2008-10-17
  • 打赏
  • 举报
回复
附加一个:
5. 使用BOOST_STATIC_ASSERT, 如下:
class A
{
public:
template <typename T>
A & operator < <(T rhs)
{
BOOST_STATIC_ASSERT((boost::is_integral<T>::value));
//some integral operation
}
};

int main(void)
{
A a;
a < < 123; //Ok
a < < 123.0/*或其他非整数类型*/; //编译失败,但是错误信息指向BOOST_STATIC_ASSERT一行
}

如果没有好办法,只有用这种了

64,641

社区成员

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

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