2013-10-25 9 views
0

Я новичок в вариативных шаблонах C++ 11 и не знаю, является ли то, что я делаю неправильно, простая синтаксическая ошибка, или это невозможно. Я хотел бы написать что-то вроде следующего:Динамические члены класса

template< typename... Args > 
struct Test 
{ 
    Args... args; 
    Test(Args... args_) : args(args_...) { 
    } 
}; 

В основном этот класс будет иметь «псевдо динамических членов». Я попытался это с:

struct A {}; 
template< typename... Args > 
A* MakeB(Args... args) 
{ 
    struct B : public A 
    { 
     Args... args; 
     B(Args... args_) : args(args_...) { 
     } 
    }; 
    return new B; 
}; 

ли это невозможно, или я просто не очень хорошо с переменным числом шаблонов?

ответ

4

Пакеты не являются типами и не могут использоваться как типы. Это специальная конструкция только для использования в шаблонах. У вас не может быть «член пакета».

Типичным решением является членом кортежа:

#include <tuple> 

template< typename... Args > 
struct Test 
{ 
    std::tuple<Args...> args_; 

    Test(Args const &... args) 
    : args_(args_...) 
    { } 
}; 

Ваш маленький производитель будет выглядеть следующим образом:

template <typename ...Args> 
Test<Args...> make_test<Args const &... args) 
{ 
    return Test<Args>(args...); 
} 

Использование:

auto t = make_test(1, true, 'x'); // makes a Test<int, bool, char> 
+0

Есть ли способ, чтобы извлечь данные, чтобы я мог использовать синтаксис расширения, чтобы привести членов в вызов функции эффектно, т. е. func (args ...); ? –

+1

@ TheFloatingBrain См. Http://stackoverflow.com/q/687490/420683 – dyp

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