std::variant 或 std::anystd::enable_shared_from_this
std::shared_ptr 管理实例,安全创建自己的共享指针shared_from_this()
operator |
expected 作为错误处理数据结构
template <typename MessageType>
struct with_client {
MessageType value;
tcp::socket *socket;
void reply(const std::string& message) const
{
asio::async_write(
*socket,
asio::buffer(message, message.length()),
[](auto, auto) {});
}
};
auto transform = [](auto f) {
return reactive::operators::transform(lift_with_client(f));
};
auto filter = [](auto f) {
return reactive::operators::filter(apply_with_client(f));
};
asio::io_service event_loop;
auto pipeline =
service(event_loop)
| transform(trim)
// Ignoring comments and empty messages
| filter([] (const std::string &message) {
return message.length() > 0 && message[0] != '#';
})
// Trying to parse the input
| transform([] (const std::string &message) {
return mtry([&] {
return json::parse(message);
});
})
// Converting the result into the bookmark
| transform([] (const auto& exp) {
return mbind(exp, bookmark_from_json);
})
| sink([] (const auto &message) {
const auto exp_bookmark = message.value;
if (!exp_bookmark) {
message.reply("ERROR: Request not understood\n");
return;
}
if (exp_bookmark->text.find("C++") != std::string::npos) {
message.reply("OK: " + to_string(exp_bookmark.get()) + "\n");
} else {
message.reply("ERROR: Not a C++-related link\n");
}
});
template < typename Representation
, typename Ratio = std::ratio<1>
>
class distance {
public:
explicit constexpr distance(Representation value)
: value(value)
{
}
distance operator+ (const distance &other) const
{
return distance(value + other.value);
}
Representation value;
};
template <typename Representation>
using meters = distance<Representation>;
template <typename Representation>
using kilometers = distance<Representation, std::kilo>;
template <typename Representation>
using centimeters = distance<Representation, std::centi>;
template <typename Representation>
using miles = distance<Representation, std::ratio<1609>>;
namespace distance_literals {
constexpr kilometers<long double> operator ""_km(long double distance)
{
return kilometers<long double>(distance);
}
constexpr miles<long double> operator ""_mi(long double distance)
{
return miles<long double>(distance);
}
}