可変数の型を引数として受け入れるテンプレートクラスがあります。コンストラクタは、パラメータ型としてArgs... - 1
を使用するクラスのインスタンスへのポインタを受け取ります。インターネット上で検索すると、このタイプの問題を処理するためにstd::tuple
がよく使用されることがわかりましたが、テンプレート引数を取り、タプルを作成し、最後の型を削除してから再度タプルを展開して保存しますその結果は後でparent()
関数で取り出すことができる変数になります。変数の型として最後の1つを除くすべての可変テンプレート引数を展開します
template<typename ...Args>
class MyClass
{
public:
MyClass(MyClass<Args...> *parent) : parent_(parent) // Should be Args - 1
{
}
MyClass<Args...>* parent()
{
return parent_;
}
private:
MyClass<Args...> *parent_;
};
タプルを含む類似のトピックについて、私はここでさまざまな答えをStackOverflowで見つけました。このコードは別の質問に投稿されており、最後のものを除くすべてのパラメータを含むタプルを取得する必要があります。問題は、そのタプルを再び解凍するためにそれをどのように適応させるべきかわかりません。
template<typename, typename>
struct concat_tuple { };
template<typename... Ts, typename... Us>
struct concat_tuple<std::tuple<Ts...>, std::tuple<Us...>>
{
using type = std::tuple<Ts..., Us...>;
};
template <class T>
struct remove_last;
template <class T>
struct remove_last<std::tuple<T>>
{
using type = std::tuple<>;
};
template <class T, class... Args>
struct remove_last<std::tuple<T, Args...>>
{
using type = typename concat_tuple<std::tuple<T>, typename remove_last<std::tuple<Args...>>::type>::type;
};
あなたのコードですべてのことが可能です(Argsのコメントを外している限り)。作成者のメソッドを公開していない可能性があります。デフォルトのクラスメンバアクセス修飾子はprivateです... –
@WojciechFrohmberg OPは 'remove_last :: type'からタプルを解く方法を知らない –
@WojciechFrohmbergコメントArgsは単にタイプミスでした:D – Stefano