Я попытался изо всех сил найти ответ на свой вопрос, и, хотя я нашел хорошие ресурсы, я все еще не могу обернуть это вокруг. Прежде всего, я не очень хорошо знаком с новым стандартом 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 три раза? Я предполагаю, что на основе аргументов будет вызываться другая версия функции, которая соответствует предоставленным аргументам?
Я чувствую, что пробиваю себе путь выше моего веса, и что я смотрю на работу мастера, который взял много ярлыков при написании этого кода, хотя он, по-видимому, сделал всю конструкцию и кодировку за одну ночь , но я чувствую, что мое понимание программирования значительно улучшится, если мне нужно будет понять, что здесь происходит.
О, я полностью понимаю это сейчас. Я полностью забыл, как работает деривация классов, теперь все имеет смысл. И я знал, что когда я собирал C++, я должен был больше внимания уделять перегрузкам, и я вроде как сделал, но я не думал, что они будут использоваться с вариационными шаблонами. Спасибо, куча объяснений! Если бы я использовал свой мозг, я бы тоже подумал! У меня есть только один последний вопрос: где именно данные возвращаются в первый вызов AddByte? Является ли MIDIvec вектором в этом случае? – SaintOfWar
@SaintOfWar да, 'MIDIvec' является' std :: vector'. – ForEveR
Спасибо! Кажется, я понял это сейчас. – SaintOfWar