我有功能模板:
template<class Ty,
typename std::enable_if< std::is_arithmetic<Ty>::value >::type* = nullptr >
inline void printBars(std::vector<Ty> const& y,
std::function<Ty(Ty)> const& alt);
我想知道是否有一些方法可以使用第二个参数中第一个函数参数推导出的类型,以便能够以这种方式使用此函数模板:
#include <cmath>
printBars(y, log10);
有吗?
答案 0 :(得分:1)
任何计算机科学问题都可以通过另一层次的间接解决。
在public函数中,只需让第二个参数为U
类型,第二个模板参数,并将调用转发给实际函数实现。
例如,如果要区分数组和指针参数,则此方法也是必需的。
实施例
namespace detail{
template< class T >
void printBars( std::vector<T> const& y, std::function<T(T)> const& alt)
{
// whatever.
};
} // namespace detail
template<
class T, class U,
class enabled = std::enable_if< std::is_arithmetic<T>::value >::type >
void printBars( std::vector<T> const& y, U const& alt )
{
detail::printBars_impl<T>( y, alt );
};
免责声明:compilar的手没有触及的代码,+刚出床(还没有咖啡)。 ; - )
考虑到这一点,这里最好的可能就像Xeo建议并完全免除std::function
一样,因为它似乎只是对来电者施加了一个不合理的约束;而只需检查该参数是否支持您想要使用它的内容。