c++:引用包装器和printf
C++: reference wrappers and printf
我有一个std::reference_wrapper
对象的std::vector
,我想用printf(没有cout)打印;现在,如果我写
int a=5;
std::reference_wrapper<int> b=a;
printf("%inn",b);
我得到一个无意义的数字(我认为是a
的地址);要获取我的值,我必须执行
printf("%inn",b.get());
是否有一种方法可以自动调用printf
中的.get()
函数(例如,打印我reference_wrapper content
的不同%
规格),以便我可以制作一个与std::reference_wrapper<type>
和type
一起工作的广义函数?
您可能希望至少考虑使用c++ IO库而不是遗留的C函数。话虽如此,您可以围绕printf
编写一个包装器,以提供对引用包装器的打开:
template<typename... Params>
void my_printf(char const* fmt, Params&&... ps)
{
printf(fmt, unwrap(std::forward<Params>(ps))...);
}
与unwrap
实现如下:
template<typename T>
decltype(auto) unwrap_impl(T&& t, std::false_type){
return std::forward<T>(t);
}
template<typename T>
decltype(auto) unwrap_impl(T&& t, std::true_type){
return t.get();
}
template<typename T>
decltype(auto) unwrap(T&& t)
{
return unwrap_impl(std::forward<T>(t), is_reference_wrapper<std::decay_t<T>>{});
}
与is_reference_wrapper
性状:
template<typename T>
struct is_reference_wrapper : std::false_type {};
template<typename T>
struct is_reference_wrapper<std::reference_wrapper<T>> : std::true_type{};
演示printf()
是一个C库函数,它完全不了解c++类和引用,也永远不会了解它们。
c++有自己的输入/输出库,它使用流对象,知道c++类,以及如何使用它们:
#include <iostream>
#include <memory>
int main()
{
int a=5;
std::reference_wrapper<int> b=a;
std::cout << b << std::endl;
return 0;
}
输出:5
printf
不做隐式类型转换,至少在本例中没有为std::reference_wrapper调用转换操作符,要使其工作,您需要使用可以进行类型转换的东西,如std::cout
。
#include <iostream>
int a=5;
std::reference_wrapper<int> b=a;
int main() {
std::cout<<b<<std::endl;
}
相关文章:
- 如何在c++17中制作一个模板包装器/装饰器
- std::vector的包装器,使数组的结构看起来像结构的数组
- 如何在c++迭代器类型中包装std::chrono
- 是否可以用"iostream"包装现有的TCP/OOpenSSL会话
- 用pybind11包装C++抽象类时出错
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 内联程序集printf将整数解释为地址
- 为左值和右值的包装器实现C++范围
- C结构,其指针将被包装在unique_ptr中
- 为什么mpfr_printf与十六进制浮点(%a转换说明符)的printf不同
- 如何包装第三方DLL在R中使用
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 将 N-arg 函数包装到另一个函数中
- 元组由 Swig 生成的 Python 包装器返回,用于C++向量
- 包装一个对象并假装它是一个 int
- 使用 Python Extension API 包装复杂C++类
- C++类型包装器 printf 打印错误的浮点值
- 如何将这些包装器用于 printf sprintf sprintf_s
- c++:引用包装器和printf
- 如何在 printf 上创建包装器