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

时间:2015-09-08 14:51:04

标签: 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>,
            std::conditional_t<std::is_floating_point<Ya_t>::value,
                Ya_t,
                float
            >
        >;

如果我想在声明它之后定义函数,我也必须在那里粘贴返回类型,这样就可以在整个代码中创建大量冗余。

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

我想使用预处理器宏可以实现类似的结果,但不知道如何这样做。

1 个答案:

答案 0 :(得分:3)

假设使用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 */
}