[英]Can a function return type data?
例如,我有一个 function 之类的
template<typename T>
void DoStuffWithType()
{
//stuff based on type
}
我有一个 function
"type data thing" GetTypeData()
{
return ("type data thing")TypeA;
}
所以调用函数
DoStuffWithType<TypeA>();
和
DoStuffWithType<GetTypeData()>();
做同样的事情。
不,C++ 函数不能返回数据类型。 最接近这种语言的是模板元编程,其中我们使用诸如模板专业化之类的工具来 select 是多种类型之一。 例如,以下是如何 select 基于数值的类型:
template <int N> ChooseIfNotZero {
using type = double;
};
template <> ChooseIfNotZero<0> {
using type = int;
};
在这里,类型ChooseIfNotZero<137>::type
是double
,而ChooseIfNotZero<0>::type
是int
。
不,类型和值是完全分开的。
但是,您可以使用decltype
获取基于表达式的类型:
TypeA GetTypeData();
DoStuffWithType<decltype(GetTypeData())>();
我认为您不需要 function GetTypeData()
。 C++ 是一种静态类型语言,因此编译器会以任何方式知道类型。
您当然可以使用 SFINAE 并为DoStuffWithType
设置不同的重载。
例如:
template <typename T,
typename std::enable_if<std::is_integral<T>::value>::type* = nullptr>
void DoStuffWithType(T x)
{
//stuff based on type
}
template <typename T,
typename std::enable_if<std::is_floating_point<T>::value>::type* = nullptr>
void DoStuffWithType(T x)
{
//stuff based on type
}
您可以使这些启用 ifs 比这复杂得多,但否则您可以使用常规重载 - 这更简单且更受欢迎。
使用 C++ 17,您将获得if constexpr
。 所以你可以做这样的事情:
template<typename T>
void DoStuffWithType(T x)
{
if constexpr (std::is_integral<T>::value)
{
//stuff based on type
}
else if constexpr (std::is_floating_point<T>::value)
{
//stuff based on type
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.