Instantiate typename object inside class template with any set of parameters

Viewed 99

Consider next example:

template<typename T>
class A
{
public:
    A(int p1, int p2, //any arguments needed for T constructor);
private:
    std::vector<T> vec;
};

template<typename T>
A<T>::A(int p1, int p2, //any arguments needed for T constructor)
{
    for(size_t i = 0; i < 10; ++i)
    {
        vec.push_back(T(//any arguments needed for T constructor))     
    { 
}

Can I create class template that would accept type with any constructor signature?

2 Answers

Yes.

You don't need the loop, either

template<typename T>
class A
{
public:
    template<typename... Args>
    A(Args&&... args) : vec(10, T(std::forward<Args>(args)...)) {}
private:
    std::vector<T> vec;
};

You can use a variadic template argument pack

template<typename T>
class A
{
public:
    template<typename... Args>
    A(Args&&...);
private:
    std::vector<T> vec;
};

template<typename T>
template<typename... Args>
A<T>::A(Args&&... args)
{
    for(size_t i = 0; i < 10; ++i)
    {
        vec.push_back(T(args...));
    }
}
Related