如何避免在函数定义中重复长后缀 return 类型?

How to avoid repeating long suffix return types at function definition?

有没有办法只在函数声明处编写这样的复杂 return 类型?

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
            >
        >;

如果我想在函数声明后定义它,我也必须将 return 类型粘贴到那里,这样会在整个代码中产生大量冗余。

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

我猜想使用预处理器宏可以达到类似的结果,但我不知道该怎么做。

假设使用 C++11,解决方法包括使用 alias template,例如您的情况:

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
                    >
>;

那么你可以在声明和定义中都使用这个别名模板:

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 */
}