std::map 的一个很机智用法

前提是你的编译器必须支持 C++11,否则编译不通过。

#include <iostream>
#include <typeindex>
#include <typeinfo>
#include <string>
#include <map>

class foo
{
public:
    foo()
    {}

    template <typename T>
    void test(T type, std::string msg)
    {
        // 将对应type的msg修改
        map_[typeid(type)] = &msg;
        // 输出对应值
        std::cout << *map_.at(typeid(type)) << std::endl;
    }
private:
    std::map<std::type_index, std::string*> map_;

};

int main()
{
    foo f;
    f.test(2333, "Hello"); // int
    f.test(2333.3, "World"); // double

}

分析

typeid 返回 std::type_index。
foo::test有两个参数,一个是模板参数,一个是 std::string。
map_[typeid(type)] = &msg; 的意思是,设置 map_[typeid(type)] 的值。
这个时候,f.test(2333, "Hello"); 会处理到 int,就会设置 map_[typeid(int)] 的值 (注意int)。
以此类推。这个一般应用在消息处理上(夏幻菊苣说的),或者这个上面。

C++11 中返回一个空list-initalizer

今天在看夏幻菊苣的NatsuLib中看到这么一句代码:

natThread::ResultType natThread::ThreadJob()
{
    return {};
}

这是一个什么意思呢,可以理解为:

natThread::ResultType natThread::ThreadJob()
{
    return {}; // It returns natThread::ResultType();
}

例子:

int testInt()
{
    return {}; // It returns 0
}
std::string testString()
{
    return {}; // It returns std::string();
}

参考

http://en.cppreference.com/w/cpp/language/list%20initialization
https://github.com/akemimadoka/NatsuLib/blob/master/NatsuLib/natMultiThread.cpp#L68

linux 下编译 boost 喵

$ ./bootstrap.sh --libdir=/home/jingjing/opt/share/lib --includedir=/home/jingjing/opt/share/include
$ ./b2
$ ./b2 install

boost的根目录里面的boost目录就是include喵。
cmake 直接填 boost 的根目录就可以了喵。
这是喵喵给自己看的喵

利用 C++ 編寫一個Telegram機器人[2] 分析HelloWorld代碼

上篇文章編寫了一個Hello World,現在簡單分析一下hello_tgbot.cpp。
源文件:

#include <stdio.h>
#include <tgbot/tgbot.h>
int main() {
    TgBot::Bot bot("TOKEN");
    bot.getEvents().onCommand("start", [&bot](TgBot::Message::Ptr message) {
        bot.getApi().sendMessage(message->chat->id, "Hi!");
    });
    bot.getEvents().onAnyMessage([&bot](TgBot::Message::Ptr message) {
        printf("User wrote %s\n", message->text.c_str());
        if (StringTools::startsWith(message->text, "/start")) {
            return;
        }
        bot.getApi().sendMessage(message->chat->id, "Your message is: " + message->text);
    });
    try {
        printf("Bot username: %s\n", bot.getApi().getMe()->username.c_str());
        TgBot::TgLongPoll longPoll(bot);
        while (true) {
            printf("Long poll started\n");
            longPoll.start();
        }
    } catch (TgBot::TgException& e) {
        printf("error: %s\n", e.what());
    }
    return 0;
}

代码也是比较简单,完全注释如下:

#include <stdio.h>
#include <tgbot/tgbot.h>

int main() {
    TgBot::Bot bot("311798585:AAGuRp1I1oMQmErl8O6SCSK8j2nNrrOtEOE"); // TOKEN
    bot.getEvents().onCommand("start", [&bot](TgBot::Message::Ptr message) { // 命令事件 lambda表达式
        bot.getApi().sendMessage(message->chat->id, "Hi!");
    });

    bot.getEvents().onAnyMessage([&bot](TgBot::Message::Ptr message) { // 任何信息 事件
        printf("User wrote %s\n", message->text.c_str()); // 用户说了啥
        if (StringTools::startsWith(message->text, "/start")) { // 防止重复
            return;
        }
        bot.getApi().sendMessage(message->chat->id, "Your message is: " + message->text); // 发送消息  message->chat->id 是聊天ID,类似UUID
    });

    try {
        printf("Bot username: %s\n", bot.getApi().getMe()->username.c_str()); // 获取 bot name
        TgBot::TgLongPoll longPoll(bot); // 长循环
        while (true) {
            printf("Long poll started\n");
            longPoll.start(); // 类似 WIN32 接受信息
        }
    } catch (TgBot::TgException& e) { // 遇到问题
        printf("error: %s\n", e.what()); // 输出问题描述
    }
    return 0;
}