繁体   English   中英

function 可以返回类型数据吗?

[英]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>::typedouble ,而ChooseIfNotZero<0>::typeint

不,类型是完全分开的。

但是,您可以使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM