C++ 包装器和可变参数模板混淆

C++ Wrappers and Variadic Templates Confusion

我已尽力找到问题的答案,虽然我确实找到了一些很好的资源,但我仍然无法解决这个问题。首先,我对新的 C++11 标准不是很熟悉。 Variadic 模板和所有这些东西,让我的头很快就痛了。我也不怎么玩 C++ 的 STL,所以即使是向量对我来说也有点偏左,我很喜欢 Python,我的大部分经验都在那里。但最近在网上冲浪时,我对构建自己的 MIDI player/creator 感到好奇,我发现了一个不错的资源。如果需要上下文,我会在评论中 post 它,但我无法理解的是:

typedef unsigned char byte;

/* First define a custom wrapper over std::vector<byte>
 * so we can quickly push_back multiple bytes with a single call.
 */
class MIDIvec: public std::vector<byte>
{
public:
    // Methods for appending raw data into the vector:
    template<typename... Args>
    void AddBytes(byte data, Args...args)
    {
        push_back(data);
        AddBytes(args...);
    }
    template<typename... Args>
    void AddBytes(const char* s, Args...args)
    {
        insert(end(), s, s + std::strlen(s));
        AddBytes(args...);
    }
    void AddBytes() { }
};

从最上面开始,我不知道 class MIDIvec: public std::vector 是做什么的。我明白——实际上,我什至不确定。我明白 class 在做什么,但我不明白它背后的逻辑。

首先,wrapping vector MIDIvec 似乎允许 MIDIvec 调用 vector 成员函数,对吗?其次,我不理解这些模板——我确实理解它们是如何工作的,我真的应该 google 这个,我做到了,但是从我的代码示例的意义上来说,解释对我来说真的很难理解提供。

还有,Variadic Templates负责定义AddBytes 3次吗?我假设基于参数,将调用与提供的参数匹配的函数的不同版本?

我觉得我的力量超出了我的体重,而且我正在看一位大师的作品,他在编写这段代码时走了很多捷径,尽管他显然是一次完成了所有的设计和编码晚上,但我觉得如果有人帮助我理解这里发生的事情,我自己对编程的理解将会大大提高。

Class MIDIvec是从vector推导出来的,总体设计不好,组合会更好

AddBytes 有 3 个重载,一个用于 byte 和 args pack,一个用于 const char* 和 args pack,一个用于空包(递归结束)。

那么,就这样吧。

AddBytes(byte(1), "abc", byte(2));

这里会用byte第一个arg调用一个,因为pack是byteconst char*byte,所以from函数会用[=调用一个14=],因为现在 pack 是 const char*byte,然后将被称为带有 byte 的一个,因为 pack 是 byte 然后将被称为没有参数的一个,因为包装是空的。