通用唯一指针

时间:2018-07-21 05:39:32

标签: c++

下面是我的示例代码:

#include <functional>
#include <iostream>
#include <memory>
using namespace std::placeholders;

template <typename recvtype, typename responsetype>
void myfunc(std::unique_ptr<recvtype> input, std::function<void(std::unique_ptr<responsetype>)> callback)
{
        auto msg = std::make_unique<responsetype>();
        callback(std::move(msg));
    return;
}

class Ret
{
public:
Ret(){}
void BRet(std::unique_ptr<Ret> r)
{
std::cout << "Called Me!!!" << std::endl << std::fflush;
}

};

class In
{
public:
In(){}
};

void test(std::unique_ptr<In> input, std::function<void(std::unique_ptr<Ret>)> callback)
{
myfunc<In , Ret>(std::move(input), callback);
}

int main()
{
std::unique_ptr<In> a = std::make_unique<In>();
Ret r1;
std::function<void(std::unique_ptr<Ret>)> f = std::bind(&Ret::BRet, &r1, _1);
test(std::move(a),f);
}

当我编译并执行代码时,输​​出如下:

$ c++ --std=c++14 -g try17.cpp

MINGW64 /c/test
$ ./a.exe
Called Me!!!
1
MINGW64 /c/test
$

我不确定在控制台上从何处打印'1'以及如何进行 test 以接受通用的唯一指针-我的意思是测试方法现在可以要求使用任何类型,而不是“输入和返回” 类型?

1 个答案:

答案 0 :(得分:6)

1来自此行:

std::cout << "Called Me!!!" << std::endl << std::fflush;

请注意,最后使用std::fflush。那不是std::flush操纵器,而是std::fflush函数。

该函数衰减为始终为true的布尔值,这就是打印1的原因。

请注意,不需要使用std::flush(操纵器),因为std::endl将刷新流。另请注意,通常也不需要std::endl,除非您明确想要刷新流。打印一条普通的换行符通常就足够了:

std::cout << "Called Me!!!\n";