如何避免在函数定义中重复长后缀 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 */
}
有没有办法只在函数声明处编写这样的复杂 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 */
}