将std :: endl转换为函数指针

时间:2014-10-10 15:39:25

标签: c++ stl

这是How template function chooses parameter?

的后续问题

@Kerrek SB提出了以下解决方案:

Func(static_cast<std::ostream&(&)(std::ostream&)>(std::endl));

我还发现以下代码也适用于我:

Func(static_cast<std::ostream&(*)(std::ostream&)>(std::endl));

问题&GT;哪一个是首选方法?

1 个答案:

答案 0 :(得分:0)

我会这样做:

template<class Sig>
struct reference_to_function {};
template<class R, class... Args>
struct reference_to_function<R(Args...)> {
  using type = R(&)(Args...);
};
template<class Sig>
using sig_t = typename reference_to_function<Sig>::type;

template<class Sig>
sig_t<Sig> pick_signature( sig_t<Sig> f ) { return f; }

然后:

Func( pick_signature<std::ostream&(std::ostream&)>( std::endl ) );

这使我明确了我想要做的事情,而不是static_cast

也许制作第二个版本,它采用类类型和签名,并为方法做。 (我无法弄清楚如何让它透明地用于方法,我认为理论上它不能)。