如何避免在函数定义时重复长后缀返回类型

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

本文关键字:后缀 返回类型 何避免 函数 定义      更新时间:2023-10-16

有什么方法可以在函数声明中编写像这样复杂的返回类型吗?

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

如果我想在函数声明后再定义它,我必须把返回类型也粘贴在那里,这样在整个代码中创建了很多冗余。

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

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

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