2

我有一个我想用 printf 打印std::vector的对象(没有 cout);std::reference_wrapper现在,如果我写

int a=5;
std::reference_wrapper<int> b=a;
printf("%i\n\n",b);

我得到一个无意义的号码(我认为是 的地址a);为了获得我的价值,我必须做

printf("%i\n\n",b.get());

有没有办法自动调用.get()函数printf(例如%,打印我的不同规范reference_wrapper content),所以我可以制作一个通用函数,既适用于std::reference_wrapper<type>type

4

3 回答 3

2

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
于 2016-11-05T16:03:25.513 回答
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{};

演示

于 2016-11-05T16:07:58.217 回答
1

printf不进行隐式类型转换,至少在这种情况下不为您的 std::reference_wrapper 调用转换运算符,为了使其工作,您需要使用可以进行类型转换的东西,例如std::cout.

#include <iostream>                                                             

int a=5;                                                                        
std::reference_wrapper<int> b=a;                                                

int main() {                                                                                                                           
    std::cout<<b<<std::endl;                                                    
}
于 2016-11-05T16:08:33.507 回答