J'essaye de repousser les paramètres d'une fonction variadique comme indiqué ci-dessous, mais le compilateur dit qu'il y a une incompatibilité de type (en raison des paramètres étant un type général alors que le vecteur est int). Que dois-je faire pour rendre les paramètres compatibles?

vector<int> x;
template<typename... Rest>
void foo(Rest... rest) {
    x.push_back(rest...);
}
2
Ansel Chang 4 avril 2017 à 02:10

2 réponses

Meilleure réponse

En C ++ 14 et avant:

void foo(Rest... rest) {
    int a[] = {0, (x.push_back(rest), 0)...};
    static_cast<void>(a);  // unused
}

En C ++ 17:

void foo(Rest... rest) {
    (x.push_back(rest), ...);
}
6
Kerrek SB 3 avril 2017 à 23:12

Commencez par un cas de base:

void push_all(vector<int>&) {}

Continuez avec le `` déballage progressif ''

template<typename... Rest>
void push_all(vector<int>& vec, int val, Rest... rest)
{
    vec.push_back(val);
    push_all(vec, rest...);
}

Pas aussi compact, mais un peu plus facile à grok.

0
John Smith 3 avril 2017 à 23:43