Forgive me if this has been answered already, as I couldn't find it...
Basically I have an object that needs to take a variadic argument list in it's constructor and store the arguments in a vector. How do I initialize a vector from a the arguments of a variadic constructor?
class GenericNode { public:     GenericNode(GenericNode*... inputs) {             /* Something like... */         // inputs_.push_back(inputs)...; } private:     std::vector<GenericNode*> inputs_; }; 
                Variadic templates are class or function templates, that can take any variable(zero or more) number of arguments. In C++, templates can have a fixed number of parameters only that have to be specified at the time of declaration. However, variadic templates help to overcome this issue.
A variadic function allows you to accept any arbitrary number of arguments in a function.
A variadic function is a function that accepts a variable number of arguments. In Golang, it is possible to pass a varying number of arguments of the same type as referenced in the function signature.
The best thing would be to use an initializer list
#include <initializer_list> #include <vector> class GenericNode { public:     GenericNode(std::initializer_list<GenericNode*> inputs)          :inputs_(inputs) {} //well that's easy private:     std::vector<GenericNode*> inputs_; }; int main() {     GenericNode* ptr;     GenericNode node{ptr, ptr, ptr, ptr}; } //compilation at http://stacked-crooked.com/view?id=88ebac6a4490915fc4bc608765ba2b6c   The closest to what you already have, using C++11 is to use the vector's initializer_list:
    template<class ...Ts>     GenericNode(Ts... inputs)          :inputs_{inputs...} {} //well that's easy too     //compilation at http://stacked-crooked.com/view?id=2f7514b33401c51d33677bbff358f8ae   And here's a C++11 version with no initializer_lists at all. It's ugly, and complicated, and requires features missing from many compilers. Use the initializer list
template<class T> using Alias = T;  class GenericNode { public:     template<class ...Ts>     GenericNode(Ts... inputs) { //SFINAE might be appropriate          using ptr = GenericNode*;          Alias<char[]>{( //first part of magic unpacker              inputs_.push_back(ptr(inputs))              ,'0')...,'0'}; //second part of magic unpacker     } private:     std::vector<GenericNode*> inputs_; }; int main() {     GenericNode* ptr;     GenericNode node(ptr, ptr, ptr, ptr); } //compilation at http://stacked-crooked.com/view?id=57c533692166fb222adf5f837891e1f9 //thanks to R. Martinho Fernandes for helping me get it to compile   Unrelated to everything, I don't know if those are owning pointers or not.  If they are, use std::unique_ptr instead.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With