模版如何静态判断子类型

Xcoder 2006-11-15 11:36:41
用模版,但对一些不同类型数据,还是要用完全不同的算法。比如整数和浮点数的舍入误差。
希望模版能在编译时确定根据参数类型,选择完全不同的算法。
示例的代码如下:

template<typename T>
T fn(T t){
#if T is integer type
...
#else if T is float type
...
#endif
}
注意这里 integer, float 是子类型,integer可以是int, unsigned int , short, char... 等
而且希望是编译期就判断的。
这种情况如何写能最简洁高效?
...全文
312 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
struct en_able{};
struct dis_able{};

template<class T>
struct Integer
{
typedef dis_able type;
};
#define TYPE_DEF(x) template<>struct Integer<x>{typedef en_able type;};

TYPE_DEF(int);
TYPE_DEF(unsigned int);
。。。。需要的整形
TYPE_DEF(char);

void func( en_able )
{
printf("enable\n");
}

void func(dis_able)
{
printf("dis_able\n");
}
int main()
{
func( Integer<char>::type() );
}
仰望星空WU 2006-11-15
  • 打赏
  • 举报
回复
study
pongba 2006-11-15
  • 打赏
  • 举报
回复
try boost::enable_if
cunsh 2006-11-15
  • 打赏
  • 举报
回复

Loki库中有这个.你<<c++设计新思维>>第2章和第3章看下.这个是用typelist弄的
飞哥 2006-11-15
  • 打赏
  • 举报
回复
能在编译期判断的东西可不多
----
飞哥 2006-11-15
  • 打赏
  • 举报
回复
typeof
  • 打赏
  • 举报
回复
用函数重载
template<typename T>
T fn(T t){
一般算法
}
int fn(int t)
{整形算法
}

float fn(float t)
{浮点数算法
}
cunsh 2006-11-15
  • 打赏
  • 举报
回复
#include "iostream"
#include "Loki\TypeTraits.h"
#include "Loki\static_check.h"
using namespace std;
using namespace Loki;

template <typename T>
T fn(T x) {
// 编译期检查是不是整数或浮点数. 如果T是其它类型则编译时报告错误.
LOKI_STATIC_CHECK(TypeTraits<T>::isIntegral || TypeTraits<T>::isFloat , leixingbudui);
//根据是不是整数类型选择一个函数调用
return fn1(x, Int2Type<TypeTraits<T>::isIntegral>());
}

template <typename T>
T fn1(T x, Int2Type<true>){
cout << "整数类型" << endl;
return x;
}

template <typename T>
T fn1(T x, Int2Type<false>){
cout << "浮点数类型" << endl;
return x;
}

int main(){
fn( 2 );
fn('a');
fn(0.2);

cin.get();
return 0;
}


输出:
整数类型
整数类型
浮点数类型


xlightx 2006-11-15
  • 打赏
  • 举报
回复
effective c++
OOPhaisky 2006-11-15
  • 打赏
  • 举报
回复
akirya(坏[其实偶不是什么所谓的坏人]) 的方法

用函数重载
template<typename T>
T fn(T t){
一般算法
}
int fn(int t)
{整形算法
}

float fn(float t)
{浮点数算法
}
---------------------------------------------------------------------------------
这个方法可以,这里利用的原理是:普通函数的优先级高于函数模板。
OOPhaisky 2006-11-15
  • 打赏
  • 举报
回复
template<typename T>
T fn(T t){
#if T is integer type
...
#else if T is float type
...
#endif
}
-------------------------------------------------------------------
如果是函数模版,利用重载;类模版,利用偏特化。

64,642

社区成员

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

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