c++ - 将 std::endl 转换为函数指针

标签 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));

问题>哪个是首选方法?

最佳答案

我会这样做:

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

也许制作第二个版本,它接受一个类类型和一个签名,并为方法做同样的事情。 (我不知道如何让它对方法透明地工作,我认为理论上它不能)。

关于c++ - 将 std::endl 转换为函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26303086/

相关文章:

c++ - 为什么 std::getline() 在格式化提取后跳过输入?

c++ - 如何让文本不在终端中滚动

c++ - __STDC_LIMIT_MACROS 和 __STDC_CONSTANT_MACROS 是什么意思?

c++ - 破坏二叉搜索树时发生读取访问冲突

c++ - 使用 LuaBridge 或 Lua 将 C++ 对象传递给 Lua 函数

c++ - 右值引用——我失去了值(value)

c++ - STL 数据结构的输出参数与堆栈返回值的效率

c++ - 逐行解析缓冲数据

c++ - 我的 boolinq .orderBy 有什么问题?