繁体   English   中英

C ++函数模板:派生和显式返回类型

[英]C++ function template: Derived and explicit return type

我有以下问题,我只是没有看到一个正确的解决方案(也许没有):我有一个模板化的方法,其中返回类型依赖于输入类型,并感谢C ++ 11 decltype返回type可以很容易地派生, 我还想允许用户在需要时明确定义返回类型。

更正式地说,我有一个模板化函数f ,我希望可以调用f(x) ,既没有显式定义输入也没有返回类型。 我还希望能够将其称为f<ret_t>x() ,并且显式定义了返回类型,但输入类型仍然是自动派生的。

现在,用C ++ 11满足第一个约束是很容易的(让我们假设还有另一个模板化的方法:

template<typename InT>
auto f(const InT& in) -> decltype(/* code deriving the return type using in */);

但是这不会允许覆盖返回类型,因为我必须将其添加为第二个模板参数并将decltype派生移动到模板定义中,并且可能需要使用std::declval<InT>std::result_of

template<
    typename InT,
    typename RetT = /* code deriving return type using InT and declval/result_of */>
RetT f(const InT& in);

但是,这样我总是需要在调用f时明确定义InT 因此声明f为了能够离开InT开放,但指定RetT应该是:

template<
    typename RetT = /* code deriving return type using InT and declval/result_of */,
    typename InT>
RetT f(const InT& in);

但是,因为在那里我需要指定一个默认值的点RetTInT尚未公布,因此无法使用。

到目前为止我能想出的最好的解决方法,这不是很令人满意,而且似乎无论如何都不起作用,因为RetT演绎失败(显然是因为你不能从默认参数中推断出类型),是:

template<typename RetT, typename InT>
RetT f(
    const InT& in,
    const RetT& = std::declval</* code deriving return type using InT or in and declval/result_of */>());

是否有更好的方法来对默认值RetT是依赖于InT ,同时仍然能够显式地指定RetT如果需要的话? 重要的是要注意返回类型需要在函数实现中可用,以便RetT的对象直接分配,并且只在方法体内分配一次。

您可以使用std::conditionaldummy类型来检查函数是否具有自动推导类型或用户选择类型。

如果用户明确选择了返回类型,则返回类型将与dummy类型不同,这将是函数的返回类型。 否则只需像以前一样使用推导类型。

以下是一个使用示例:

#include <typeindex>
#include <type_traits>
#include <iostream>

struct dummy
{
};

template<typename RetType = dummy, typename T>
auto f(const T& in)
-> typename std::conditional<std::is_same<RetType, dummy>::value, T, RetType>::type
{
    std::cout<<typeid(RetType).name()<<" "<<typeid(T).name()<<std::endl;
    return in;
}

int main()
{
    f(1);
    f<float>(1);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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