C++ 如何避免在函数定义中重复长后缀返回类型?

C++ 如何避免在函数定义中重复长后缀返回类型?,c++,metaprogramming,return-type,C++,Metaprogramming,Return Type,有没有办法只在函数声明中编写这样的复杂返回类型 template<typename Xa_t, typename Ya_t, typename Xb_t> auto interpolate(const Func<Xa_t, Ya_t> & f, const std::vector<Xb_t> & vec) -> Func<std::common_type_t<Xa_t, Xb_t>,

有没有办法只在函数声明中编写这样的复杂返回类型

template<typename Xa_t, typename Ya_t, typename Xb_t>
auto interpolate(const Func<Xa_t, Ya_t> & f, const std::vector<Xb_t> & vec) ->
        Func<std::common_type_t<Xa_t, Xb_t>,
            std::conditional_t<std::is_floating_point<Ya_t>::value,
                Ya_t,
                float
            >
        >;
模板
自动插值(常数函数&f,常数标准::向量&vec)->
Func;
如果我想在声明函数后定义它,我也必须将返回类型粘贴到那里,这样会在整个代码中产生大量冗余

我对c++11和c++14两种方式都持开放态度。(MSVC优先)


我想预处理器宏也可以达到类似的效果,但我不知道如何做到这一点。

假设C++11,解决方法包括使用,例如在您的案例中:

template<typename Xa_t, typename Ya_t, typename Xb_t>
using interpolate_return_type = Func<
  std::common_type_t<Xa_t, Xb_t>,
  std::conditional_t<std::is_floating_point<Ya_t>::value,
                     Ya_t,
                     float
                    >
>;
模板
使用插值返回类型=Func<
标准::普通类型,
std::有条件的
>;
然后,您可以在声明和定义中使用此别名模板:

template<typename Xa_t, typename Ya_t, typename Xb_t>
interpolate_return_type<Xa_t, Ya_t, Xb_t> interpolate(const Func<Xa_t, Ya_t> & f, const std::vector<Xb_t> & vec);

/* ... stuff ...*/

template<typename Xa_t, typename Ya_t, typename Xb_t>
interpolate_return_type<Xa_t, Ya_t, Xb_t>
interpolate(const Func<Xa_t, Ya_t> & f, const std::vector<Xb_t> & vec) {
/* more stuff */
}
模板
插值\返回\类型插值(常量Func&f,常量std::vector&vec);
/* ... 东西*/
模板
插值返回类型
插值(常数函数&f,常数标准::向量&vec){
/*更多的东西*/
}

我想我还没有完全理解。您能否编辑您的问题,以包含一个您希望最终代码看起来如何的示例?编辑后,想象一下定义声明+{},没有返回类型规范,看起来很棒,谢谢。虽然我真的不明白为什么没有一个简单的关键字可以复制声明中描述的返回类型,因为函数不能按返回类型不同。@AndrewVegvari:对于模板,函数只能按返回类型不同。