返回不同的数据类型,而无需显式指定数据类型
return different data type without explicitly specify data type
我想这样做:
template<class T>
T foo(uint8_t x)
{
if (x<32) return ((int32_t)1<<x);
else return ((int64_t)1<<x);
}
,但我不想调用foo<int32_t>(x)
或foo<int64_t>(x)
。它看起来不太好看。我希望返回类型能被自动正确地推导出来。
预期用法示例:
std::max(foo(10),some_variable); // return type of foo need to match some_variable
std::min(foo(32),another_variable);
解决方案不一定是模板。如果宏可以实现相同的功能,我很乐意使用宏。有什么建议吗?
函数(甚至是模板函数)的返回类型—事实上,任何表达式,如果我没弄错的话,这就是为什么Gill的答案解决不了任何问题—是一个编译时属性。你想在你的代码是一个运行时决策。这是一个根本的冲突,不能直接解决(即使是类型定义也不能解决这个矛盾)。
你可以做的是使用某种句柄或容器。例如,你总是可以返回一个64位整数,从某种意义上说,它是较短专门化的基类型(也就是说,你总是可以将短int型转换为64位int型,但不一定反之亦然)。
您还可以编写更复杂的程序(大num类、多态类等),但本质是相同的:返回类型将是编译时固定的,并且该类型将能够以某种方式存储所有可能的值,并具有关于它实际是什么"类型"的一些运行时信息(如果所有值都是整数,则运行时信息就是值本身),并且可能带有强类型转换方法。
解决方案不一定是模板。如果宏可以实现同样,我很乐意使用宏。
是的,但这并不比显式地告诉Foo
你想要什么模板类型更干净。
无论如何,这是可以做到的,但它不是很漂亮:
#include <iostream>
#include <stdint.h>
#define FOO(x) (x < 32 ? Foo_32(x) : Foo_64(x))
int32_t Foo_32(uint8_t x)
{
std::cout << "32n";
return (int32_t)1<<x;
}
int64_t Foo_64(uint8_t x)
{
std::cout << "64n";
return (int64_t)1<<x;
}
int main() {
FOO(35);
FOO(22);
return 0;
}
相关文章:
- H5Tget_member_type() 返回复合 HDF5 数据类型的奇怪值
- 在C++中,运算符 sizeof 返回什么数据类型?
- 函数重载并根据相同的输入返回不同的数据类型
- 返回给定 SEXP 的子集,而无需知道实际的内部数据类型
- 返回time()库函数的数据类型
- 如何访问从 COM 对象返回的 VARIANT 数据类型中的安全数组C++?
- 如何将两个 jlong 数据类型转换为 jstring,然后将两个字符串连接在一起以便从 JNI 将字符串返回给 jav
- 返回字符串和不同向量数据类型的映射C++
- 返回int数据类型v/s传递参考
- 从保存变量数据类型的数据结构中检索值,而不指定返回类型
- 使用纯抽象数据类型作为返回
- 数据类型(从 malloc 返回)是如何转换的?
- Oracle 11gR1或R2客户端上是否设置了在ODBC API调用中将SELECT COUNT(*)返回的数据类型从
- 从SQL Server返回C++本机客户端中的NULL数据类型
- 多态性不适用于相同数据类型(Base和Inherited类)的函数返回值
- RegGetValue返回的数据类型与admx文件中提到的gpo设置的数据类型不同
- 从Boost::spirit解析返回多个数据类型
- 有没有一种方法可以将C++数据类型作为变量返回
- 返回一组数据类型之一的最佳模式
- 特定 std::bind 返回的数据类型到底是什么