2016-01-15 4 views
-1

Я попытался изо всех сил найти ответ на свой вопрос, и, хотя я нашел хорошие ресурсы, я все еще не могу обернуть это вокруг. Прежде всего, я не очень хорошо знаком с новым стандартом C++ 11. Вариадические шаблоны и все такое, у меня голова болит очень быстро. Я тоже много играл с STL на C++, поэтому даже векторы для меня немного левого поля, и мне очень нравится Python, и большинство моих опытов есть. Но в последнее время я занимался серфингом в Интернете, мне было любопытно создать собственный MIDI-плеер/создатель, и я нашел хороший ресурс. Я отправлю его в комментариях, если контекст не требуется, и просили, но то, что я имею понимание тревоги заключается в следующем:C++ Wrappers and Variadic Templates Confusion

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: общественный зЬй :: вектор. Я так понимаю, на самом деле, я даже не уверен в этом. Я понимаю, что делает класс, но я не понимаю его логики.

Прежде всего, оказывается, что вектор обтекания MIDIvec позволяет MIDIvec вызывать функции векторных членов, это правильно? И, во-вторых, я не понимаю эти шаблоны - я действительно понимаю, как они работают, и я действительно должен это делать, и я это сделал, но мне было очень сложно объяснить это в том смысле, который я представил в коде.

Также есть Шаблоны Variadic, ответственные за определение AddBytes три раза? Я предполагаю, что на основе аргументов будет вызываться другая версия функции, которая соответствует предоставленным аргументам?

Я чувствую, что пробиваю себе путь выше моего веса, и что я смотрю на работу мастера, который взял много ярлыков при написании этого кода, хотя он, по-видимому, сделал всю конструкцию и кодировку за одну ночь , но я чувствую, что мое понимание программирования значительно улучшится, если мне нужно будет понять, что здесь происходит.

ответ

0

Класс MIDIvec получен из вектора, плохая конструкция в целом и состав будет лучше.

AddBytes имеет 3 перегрузок, один для byte и арг пакет, один для const char* и арг пакет и один для пустого пакета (конец рекурсии).

Итак, назовем это.

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

Здесь будет называться один с byte первой ARG, так как пакет byte, const char*, byte, то из функции будет называться один с const char*, так как в настоящее время пакет является const char*, byte, то будет называться один с byte, так как пакет byte, а затем будет называться без аргументов, так как пакет пуст.

+0

О, я полностью понимаю это сейчас. Я полностью забыл, как работает деривация классов, теперь все имеет смысл. И я знал, что когда я собирал C++, я должен был больше внимания уделять перегрузкам, и я вроде как сделал, но я не думал, что они будут использоваться с вариационными шаблонами. Спасибо, куча объяснений! Если бы я использовал свой мозг, я бы тоже подумал! У меня есть только один последний вопрос: где именно данные возвращаются в первый вызов AddByte? Является ли MIDIvec вектором в этом случае? – SaintOfWar

+0

@SaintOfWar да, 'MIDIvec' является' std :: vector'. – ForEveR

+0

Спасибо! Кажется, я понял это сейчас. – SaintOfWar

Смежные вопросы