C ++:reference wrappers和printf

时间:2016-11-05 15:52:53

标签: c++ reference printf stdvector reference-wrapper

我有一个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

的功能

3 个答案:

答案 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{};

demo

答案 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