私が持っていると仮定します
_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;
}
_
ややこのような。 (ここでMyClass
はT
の一例です。)どうやら、コンパイラーでは_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...
_を一致させる構文的に明確な方法を提供するだけで、何もしない追加のヘルパー関数が必要です。
単一の関数でこれを本当に実行したいです。毎回、パラメーターパックを取得するときはいつでも、本当に補助関数を定義する必要がありますか?
編集:Ints
とMyFunc
は単なるおもちゃの例です。テンプレートパラメータを取得する一般的な方法を知りたい!
さまざまな表現を取得するには、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();
}