web-dev-qa-db-ja.com

補助関数テンプレートなしで可変テンプレートテンプレートパラメーターを取得する方法?

私が持っていると仮定します

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

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

私がやりたいことは簡単です。

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

ややこのような。 (ここでMyClassTの一例です。)どうやら、コンパイラーでは_S..._は無効のようです。

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

これも機能しません。 get()から、_S..._は特定され、自動的に推測可能になると思いますが、コンパイラはそれを認識しません。 (私にはわかりませんが、C++は関数内を見ているテンプレートパラメータを推定せず、引数と戻り値の型のみを推定します)

私が見つけた唯一の方法は、_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);
}
_

それはうまく機能しますが、テンプレートを使用して_S..._を一致させる構文的に明確な方法を提供するだけで、何もしない追加のヘルパー関数が必要です。

単一の関数でこれを本当に実行したいです。毎回、パラメーターパックを取得するときはいつでも、本当に補助関数を定義する必要がありますか?

編集:IntsMyFuncは単なるおもちゃの例です。テンプレートパラメータを取得する一般的な方法を知りたい!

15
i.stav

さまざまな表現を取得するには、struct Intに関数を追加することをお勧めします

#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