这是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;哪一个是首选方法?
答案 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
。
也许制作第二个版本,它采用类类型和签名,并为方法做。 (我无法弄清楚如何让它透明地用于方法,我认为理论上它不能)。