2014-12-22 4 views
0

У меня есть структура:Инициализировать массив структуры с векторами

enum VAR; 
typedef void (*VoidF)(); 
struct Function 
{ 
    const char* name; 
    VAR return_type; 
    vector<VAR> args; 
    VoidF f; 
}; 

И я могу инициализировать его, как это в VS2013:

const Function funcs[] = { 
    "print", V_VOID, { V_STRING }, f_print, 
    "pause", V_VOID, {}, f_pause, 
    "getstr", V_STRING, {}, f_getstr, 
    "getint", V_INT, {}, f_getint, 
    "pow", V_INT, { V_FLOAT, V_FLOAT }, f_pow, 
    "getfloat", V_FLOAT, {}, f_getfloat 
}; 

Но мне нужно, чтобы это работало в VS2008 тоже. Есть ли другой способ, который затем меняет это на функцию и толкает векторные элементы один за другим? У меня есть этот код на git, и ему нужно работать с обеими версиями.

VS2008 не поддерживает функции от C++ 11.

+0

Дополнительные фигурные скобки, может быть? '{" print ", V_VOID, {V_STRING}, f_print}, // и т. д.' –

+0

Те же ошибки C2552: 'Функция :: args': неагрегаты не могут быть инициализированы с помощью списка инициализаторов 'std :: vector <_Ty>': Типы с базой не объединены с [_Ty = VAR] – Tomashu

+0

Вам нужно добавить фигурные скобки вокруг каждой строки - http://melpon.org/wandbox/permlink/wAELo1XDzUr09AI3 – 0x499602D2

ответ

0

Найдено некоторые связанные ответы здесь: What is the easiest way to initialize a std::vector with hardcoded elements?

решил написать это:

Function::Function(cstring name, VAR return_type, VoidF f, ...) : name(name), return_type(return_type), f(f) 
{ 
    va_list a; 
    va_start(a, f); 
    while(true) 
    { 
     VAR type = va_arg(a, VAR); 
     if(type == V_VOID) 
      break; 
     else 
      args.push_back(type); 
    } 
    va_end(a); 
} 

const Function funcs[] = { 
    Function("print", V_VOID, f_print, V_STRING, V_VOID), 
    Function("pause", V_VOID, f_pause, V_VOID), 
    Function("getstr", V_STRING, f_getstr, V_VOID), 
    Function("getint", V_INT, f_getint, V_VOID), 
    Function("pow", V_FLOAT, f_pow, V_FLOAT, V_FLOAT, V_VOID), 
    Function("getfloat", V_FLOAT, f_getfloat, V_VOID) 
}; 
Смежные вопросы