只能在函数声明中编写这样的复杂返回类型吗?
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首选)
我想使用预处理器宏可以实现类似的结果,但不知道如何这样做。
答案 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 */
}