return 不同的数据类型,没有明确指定数据类型
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)
。它看起来 nice.I 不希望自动正确推导 return 类型。
预期用法示例:
std::max(foo(10),some_variable); // return type of foo need to match some_variable
std::min(foo(32),another_variable);
解决方案不必是模板。如果宏也能达到同样的效果,我很乐意使用宏。有什么建议吗?
The solution does not have to be template. If macros can achieve the
same, I'm happy to use macros.
是的,但这并没有比明确告诉 Foo
你想要什么模板类型更干净。
总之,这个 can be done 但它并不漂亮:
#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 << "32\n";
return (int32_t)1<<x;
}
int64_t Foo_64(uint8_t x)
{
std::cout << "64\n";
return (int64_t)1<<x;
}
int main() {
FOO(35);
FOO(22);
return 0;
}
函数的 return 类型(甚至是模板函数)——事实上,任何 表达式 ,如果我没记错的话,这就是为什么 Gill 的回答没有解决任何问题 — 是一个 编译时间属性。 您在代码中想要的是一个 运行 时间决定。 这是无法直接解决的根本冲突(即使是 typedef 也无法解决矛盾,afaics)。
您可以做的是使用某种句柄或容器。例如,您总是可以只 return 一个 64 位整数,从某种意义上说,它是较短特化的基本类型(即,您总是可以将 short int 转换为 64 位 int,但不一定反之亦然).
你也可以编写更复杂的程序(大数 class、多态 class,随便什么),但本质是一样的:return 类型是编译型的时间是固定的,并且该类型能够以某种方式存储所有可能的值,并且有一些 运行 时间的信息关于 "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)
。它看起来 nice.I 不希望自动正确推导 return 类型。
预期用法示例:
std::max(foo(10),some_variable); // return type of foo need to match some_variable
std::min(foo(32),another_variable);
解决方案不必是模板。如果宏也能达到同样的效果,我很乐意使用宏。有什么建议吗?
The solution does not have to be template. If macros can achieve the same, I'm happy to use macros.
是的,但这并没有比明确告诉 Foo
你想要什么模板类型更干净。
总之,这个 can be done 但它并不漂亮:
#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 << "32\n";
return (int32_t)1<<x;
}
int64_t Foo_64(uint8_t x)
{
std::cout << "64\n";
return (int64_t)1<<x;
}
int main() {
FOO(35);
FOO(22);
return 0;
}
函数的 return 类型(甚至是模板函数)——事实上,任何 表达式 ,如果我没记错的话,这就是为什么 Gill 的回答没有解决任何问题 — 是一个 编译时间属性。 您在代码中想要的是一个 运行 时间决定。 这是无法直接解决的根本冲突(即使是 typedef 也无法解决矛盾,afaics)。
您可以做的是使用某种句柄或容器。例如,您总是可以只 return 一个 64 位整数,从某种意义上说,它是较短特化的基本类型(即,您总是可以将 short int 转换为 64 位 int,但不一定反之亦然).
你也可以编写更复杂的程序(大数 class、多态 class,随便什么),但本质是一样的:return 类型是编译型的时间是固定的,并且该类型能够以某种方式存储所有可能的值,并且有一些 运行 时间的信息关于 "type" 它实际上是什么(如果所有值都是整数, 运行时间信息本身就是值),并且可能带有强类型转换方法。