web-dev-qa-db-fra.com

Comment récupérer des paramètres de modèle variadic sans modèle de fonction auxiliaire?

Supposons que j'ai

template<int ...>
struct Ints { };

class MyClass
{
public:
    Ints<1, 2, 3> get() { return Ints<1, 2, 3>(); }
};

Ce que je veux faire est simple.

template <class T>
vector<int> MyFunc1(T& x)
{
    Ints<S...> result = x.get();
    vector<int> t = { S... };
    return t;
}

Un peu comme ça. (Ici, MyClass peut être un exemple de T.) Apparemment, pour le compilateur, S... Semble invalide.

template <class T, int... S>
vector<int> MyFunc2(T& x)
{
    Ints<S...> result = x.get();
    vector<int> t = { S... };
    return t;
}

Cela ne fonctionne pas non plus. Je pense qu'à partir de get() le S... Devient spécifique et automatiquement déductible, mais le compilateur ne le reconnaît pas. (Je ne suis pas sûr mais C++ ne déduit pas les paramètres du modèle en regardant à l'intérieur de la fonction, mais seulement les arguments et le type de retour)

La seule façon que j'ai trouvée est d'utiliser une autre fonction qui découvre ce qu'était int....

template <int ...S>
vector<int> temp(Ints<S...> not_used)
{
    return { S... };
}

template <class T>
vector<int> MyFunc3(T& x)
{
    auto result = x.get();
    return temp(result);
}

Cela fonctionne bien, mais nécessite une autre fonction d'assistance supplémentaire qui ne fait rien mais fournit simplement un moyen syntaxiquement clair de faire correspondre le S... À l'aide de modèles.

Je veux vraiment le faire juste en fonction unique. Dois-je vraiment définir une fonction auxiliaire à chaque fois que je veux récupérer des packs de paramètres?

Edit: Ints et MyFunc ne sont que des exemples de jouets. Je veux connaître la méthode générale pour récupérer les paramètres du modèle!

15
i.stav

Je suggérerais d'ajouter des fonctions au struct Int pour obtenir différentes représentations

#include <vector>
#include <array>

template<int ...values>
struct Ints {
    auto getAsVector() const {
        return std::vector<int>({ values... });
    }

    constexpr auto getAsArray() const {
        return std::array<int, sizeof...(values)>({ values... });
    }
};

class MyClass
{
public:
    Ints<1, 2, 3> get() { return Ints<1, 2, 3>(); }
};

int main() {
    MyClass a;
    auto array = a.get().getAsVector();
    return array.size();

}
0
Nishant Singh