C ++ Wrappers和Variadic模板混淆

时间:2016-01-15 10:28:11

标签: c++ c++11 stl wrapper variadic-templates

我已尽力找到问题的答案,虽然我确实找到了一些好的资源,但我还是无法解决这个问题。首先,我对新的C ++ 11标准不是很熟悉。变种模板和所有这些东西,让我的头脑快速受伤。我也没有玩过C ++的STL,所以即使是矢量对我来说也只是一个左场,而且我很喜欢Python,而且我的经验也很多。但最近网上冲浪,我很好奇构建我自己的MIDI播放器/创建者,我发现了一个很好的资源。如果需要上下文,我会在评论中发布它,但我理解的是这个:

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() { }
};

从最顶层开始,我不知道什么是类的MIDIvec:public std :: vector。我明白了 - 实际上,我对此并不确定。我理解班级正在做什么,但我不理解它背后的逻辑。

首先,看来包装矢量MIDIvec允许MIDIvec调用矢量成员函数,这是正确的吗?第二,我不明白这些模板 - 我确实理解它们是如何工作的,我应该谷歌这个,我做了,但是从我提供的代码示例的意义上来说,解释对我来说真的很难理解。

此外,Variadic模板是否负责三次定义AddBytes?我假设基于参数,将调用与提供的参数匹配的函数的不同版本?

我觉得自己正在超越自己的体重,并且我正在研究一位在写这段代码时花了很多快捷方式的大师的工作,即使他显然在一夜之间完成了所有的设计和编码,但是如果我能帮助理解这里发生的事情,我觉得我对编程的理解会有很大的提高。

1 个答案:

答案 0 :(得分:0)

MIDIvec派生自矢量,一般来说设计不好,组合会更好。

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

所以,让我们来称呼它。

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

此处将被称为byte第一个arg,因为pack为byteconst char*byte,然后函数将被称为{{1} },因为现在pack是const char*const char*,然后将被称为byte,因为pack是byte然后将被称为没有args的一个,因为pack是空。