【模板应用】如何设计一个函数,用整形参数确定它的返回值类型

kinglytt 2011-05-26 11:28:15
我想设计一个函数,得到这样的效果:该函数只有一个整形参数,如果参数的值为1,则返回一个char类型,如果参数值为2,则返回一个int类型,如果参数的值为3,则返回一个short类型,如此类推。请问有什么办法可以比较优雅的实现?多谢!
...全文
275 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
ChengNan_ 2011-06-02
  • 打赏
  • 举报
回复
感觉编译期动态确定不行,因为LZ的参数n是编译期不能够确定的。
kinglytt 2011-06-02
  • 打赏
  • 举报
回复
自己顶一下,召唤牛人!
2011-05-28
  • 打赏
  • 举报
回复
呃,貌似楼主要自定义的不只有类型,还有行为……

无视我上面的回复好了……
2011-05-28
  • 打赏
  • 举报
回复
有个模板叫作 IfThenElse……

template <bool condition, typename True, typename False>
struct IfThenElse;

template <typename True, typename False>
struct IfThenElse<true, True, False>
{
typedef True type;
};

template <typename True, typename False>
struct IfThenElse<false, True, False>
{
typedef False type;
};

template <int n>
struct ReturnType
{
typedef
typename IfThenElse< n % 10 < 3, char,
typename IfThenElse< n % 10 < 6, short,
typename IfThenElse< n % 10 < 9, int,
long>::type
>::type
>::type type;
};

template <int n>
typename ReturnType<n>::type fun()
{
return 0;
}
kinglytt 2011-05-28
  • 打赏
  • 举报
回复
补充,上面的GET宏有误,应该为:
#define GET(x) get(Int2Type<x>())
kinglytt 2011-05-28
  • 打赏
  • 举报
回复
传入的整型值是常量,这个是在编译器就确定的,所以肯定能够实现的。
目前我自己实现如下,不是很完美:
先用这个模板,把任意整型数转换为一个类型:
template <int v>
struct Int2Type
{
enum { value = v };
};
然后利用函数重载,对每一个数字实现一个对应类型的重载函数:
char& get(Int2Type<1>) {...}
int& get(Int2Type<2>) {...}
char& get(Int2Type<3>) {...}
依次类推。
然后用一个宏简化调用过程:
#define GET(x) get(Int2Type<x>)
最后,可以如下方式使用:
char c = GET(1);
GET(3) = 'c';
int i = GET(2);

这样,基本实现了我的想法,但是对于每一个整型数,都需要定义一个重载函数,不太优雅。寻求优雅的解决方案。

candeabc123 2011-05-27
  • 打赏
  • 举报
回复
使用union做返回值
pathuang68 2011-05-27
  • 打赏
  • 举报
回复
你可以定义个结构,在这个结构中包含:一个char、一个int和一个short。你的函数返回这个结构对象,然后根据提供的1,2,3来分别提取其中的char、int或者short(如果用C++,这部分内容也可以写在struct里面)。Google的android操作系统,有类似这样的做法。
taodm 2011-05-27
  • 打赏
  • 举报
回复
哈哈,楼主啊,你先说说假设这个函数确实能实现,那,你使用这个函数的代码是要怎么写?
写出来试试吧。
QQIANQQ 2011-05-27
  • 打赏
  • 举报
回复

//各位大侠看下这样可以吗?
template <class T>
struct traits{};
template <>
struct traits<int>
{
typedef int value_type;
};
template <>
struct traits<char>
{
typedef char value_type;
};

template <class I>
typename I::value_type fun(int _x)
{
//根据_x值判断一下
//返回int return int()
//返回char return char()
}

luo_miao 2011-05-27
  • 打赏
  • 举报
回复
char 和 short 都在 int 的范围内,直接返回 int 不就得了
qq120848369 2011-05-27
  • 打赏
  • 举报
回复
if else
hunter0395 2011-05-27
  • 打赏
  • 举报
回复
实现不了的。
如果让编译器校验类型,那说明你的程序还没有运行。
一旦运行起来,就和编译器没什么关系了。
如果真有这种要求,可以这样实现:
定义一个struct,用一个成员表示类型,另一个成员是个多个类型的union。
函数返回这个结构的指针。
ryfdizuo 2011-05-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kinglytt 的回复:]

可能我说的太抽象了不太好理解。
说真实一点就是,对于某一些离散的整数,该函数需要返回char型,对于另一些离散的整数,该函数需要返回int 型,等等。
例如,对于传入参数为1,3,4,5,8,...1000的,需要返回char型值,对于2,6,7,...987的需要返回int。
所以使用模板特化的办法不是很好,需要穷举所有可能,不够优雅。有没有什么优雅的解决方案?谢谢!
[/Quote]
你这个没法实现。。。
xspace_time 2011-05-27
  • 打赏
  • 举报
回复
说到穷举我想到了enum
xspace_time 2011-05-27
  • 打赏
  • 举报
回复
如果这些离散值没有规律,那就只有穷举了
kinglytt 2011-05-27
  • 打赏
  • 举报
回复
可能我说的太抽象了不太好理解。
说真实一点就是,对于某一些离散的整数,该函数需要返回char型,对于另一些离散的整数,该函数需要返回int 型,等等。
例如,对于传入参数为1,3,4,5,8,...1000的,需要返回char型值,对于2,6,7,...987的需要返回int。
所以使用模板特化的办法不是很好,需要穷举所有可能,不够优雅。有没有什么优雅的解决方案?谢谢!
zhangsongcui 2011-05-27
  • 打赏
  • 举报
回复
template <int I>
struct fn;

template <>
struct fn<1>
{
int operator()()
{
std::cout << "int" << std::endl;
return 1;
}
};

template <>
struct fn<2>
{
double operator()()
{
std::cout << "double" << std::endl;
return 2.0;
}
};

int main()
{
std::cout << fn<2>()();
}

PS:boost::variant是一个类型安全的union
缘来是梦 2011-05-27
  • 打赏
  • 举报
回复
做不到的
nicknide 2011-05-27
  • 打赏
  • 举报
回复
简单的说, C++ 这种静态语言不支持这样的用法
或者 boost::any 可以一定程度上满足你的需要(PS:我从来没用过这个)
加载更多回复(7)

64,691

社区成员

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

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