我有一个std::vector
std::reference_wrapper
个{object}我要用printf打印的对象(没有cout);现在,如果我写
int a=5;
std::reference_wrapper<int> b=a;
printf("%i\n\n",b);
我得到一个nosense号码(我认为是a
的地址);为了获得我的价值我必须做到
printf("%i\n\n",b.get());
有没有办法在.get()
中自动调用printf
函数(例如,打印我%
的另一个reference_wrapper content
特定程序),这样我就可以进行广义化适用于std::reference_wrapper<type>
和type
?
答案 0 :(得分:2)
class A {
constructor(props) {
this.props = props
}
}
class B extends A {
constructor(props) {
super(props)
console.log(this.props)
}
}
console.log(new B({title: 'hello world'}))
是一个C库函数,它对C ++类和引用一无所知,对它们一无所知。
C ++有自己的输入/输出库,它使用流对象,了解C ++类,以及如何使用它们:
printf()
输出:
#include <iostream>
#include <memory>
int main()
{
int a=5;
std::reference_wrapper<int> b=a;
std::cout << b << std::endl;
return 0;
}
答案 1 :(得分:2)
您可能希望至少考虑使用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{};
答案 2 :(得分:1)
#<Example id: 3, title: "", content: "", tags: nil, place: "", date: nil, created_at: "2016-11-04 18:31:50", updated_at: "2016-11-04 18:31:50", image_file_name: nil, image_content_type: nil, image_file_size: nil, image_updated_at: nil
不进行隐式类型转换,至少在这种情况下不为你的std :: reference_wrapper调用转换运算符,使它工作你需要使用可以进行类型转换的东西,比如{ {1}}。
printf