タグ付けされた質問 「variadic-templates」

8
一致する関数ポインターを呼び出すためのタプルの「アンパック」
std::tupleさまざまな数の値を保存しようとしています。これらの値は、保存された型と一致する関数ポインターへの呼び出しの引数として後で使用されます。 私が解決するのに苦労している問題を示す簡単な例を作成しました: #include <iostream> #include <tuple> void f(int a, double b, void* c) { std::cout << a << ":" << b << ":" << c << std::endl; } template <typename ...Args> struct save_it_for_later { std::tuple<Args...> params; void (*func)(Args...); void delayed_dispatch() { // How can I "unpack" params to call func? …

6
make_uniqueおよび完全な転送
std::make_unique標準C ++ 11ライブラリに関数テンプレートがないのはなぜですか?見つけた std::unique_ptr<SomeUserDefinedType> p(new SomeUserDefinedType(1, 2, 3)); 少し冗長。次の方がずっといいと思いませんか? auto p = std::make_unique<SomeUserDefinedType>(1, 2, 3); これはnew見事に非表示になり、タイプについては1回だけ言及します。 とにかく、ここに私の実装の試みがありますmake_unique: template<typename T, typename... Args> std::unique_ptr<T> make_unique(Args&&... args) { return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); } std::forwardコンパイルするのにかなり時間がかかりましたが、それが正しいかどうかはわかりません。それは...ですか?正確にはstd::forward<Args>(args)...どういう意味ですか?コンパイラはそれを何で作っていますか?

1
可変個関数のすべての引数でstd :: forwardをどのように呼び出しますか?
私は単に汎用オブジェクトファクトリを作成し、ブーストプリプロセッサメタライブラリを使用して可変テンプレートを作成していました(2010を使用していて、それらをサポートしていません)。私の関数はrval参照を使用std::forwardし、完全な転送を行うため、私は考えさせられました... C ++ 0Xが出て、標準のコンパイラーがあったとき、実際の可変テンプレートでこれを行います。それでも、私std::forwardは議論を呼びかけますか? template <typename ...Params> void f(Params... params) // how do I say these are rvalue reference? { y(std::forward(...params)); //? - I doubt this would work. } 私が考えることができる唯一の方法は... paramsを手動で解凍することを必要とするでしょう、そして私はまだそこにもまだありません。機能するより速い構文はありますか?

2
「……」トークンの意味は何ですか?つまり、パラメータパックの二重省略記号演算子
新しいC ++ 11ヘッダーのgccの現在の実装を閲覧しているときに、「......」トークンに遭遇しました。次のコードが[ideone.comを介して]正常にコンパイルされることを確認できます。 template <typename T> struct X { /* ... */ }; template <typename T, typename ... U> struct X<T(U......)> // this line is the important one { /* ... */ }; それで、このトークンの意味は何ですか? 編集:SOは質問タイトルの「......」を「...」にトリミングしたように見えますが、私は本当に「......」を意味していました。:)

2
可変長テンプレートのコンテキストでの「…」トークンのルールは何ですか?
C ++ 11には、次のような可変テンプレートがあります。 template< class T, class... Args > unique_ptr<T> make_unique( Args&&... args ) { return unique_ptr<T>(new T(std::forward<Args>(args)...)); } このことについて、いくつかの好奇心があります。式は、std::forward<Args>(args)...両方を使用Argsし、args一つだけ...のトークン。さらにstd::forward、1つのテンプレートパラメーターと1つの引数のみを取る非可変テンプレート関数があります。(大まかに)そのための構文規則は何ですか?どのように一般化できますか? また、関数の実装では、省略記号(...)は対象の式の最後にあります。テンプレート引数リストとパラメーターリストで省略記号が中央にある理由はありますか?

4
可変個引数テンプレートの引数を保存する方法は?
後で使用するためにパラメータパックを何らかの方法で保存することは可能ですか? template <typename... T> class Action { private: std::function<void(T...)> f; T... args; // <--- something like this public: Action(std::function<void(T...)> f, T... args) : f(f), args(args) {} void act(){ f(args); // <--- such that this will be possible } } その後、: void main(){ Action<int,int> add([](int x, int y){std::cout << (x+y);}, 3, …


10
プリティプリントstd :: tuple
これは、プリティプリントSTLコンテナに関する以前の質問のフォローアップであり、非常にエレガントで完全に一般的なソリューションを開発することができました。 この次のステップではstd::tuple<Args...>、可変個引数テンプレートを使用して、のプリティプリントを含めたいと思います(したがって、これは厳密にC ++ 11です)。のためにstd::pair<S,T>、私は単に言う std::ostream & operator<<(std::ostream & o, const std::pair<S,T> & p) { return o << "(" << p.first << ", " << p.second << ")"; } タプルを印刷するための類似の構造は何ですか? テンプレート引数スタックをアンパックし、インデックスを渡し、SFINAEを使用して最後の要素に到達したことを検出しようとしましたが、成功しませんでした。壊れたコードであなたに負担をかけないでください。問題の説明は、うまくいけば十分に簡単です。基本的に、次の動作が必要です。 auto a = std::make_tuple(5, "Hello", -0.1); std::cout << a << std::endl; // prints: (5, "Hello", -0.1) 前の質問と同じレベルの一般性(char / wchar_t、ペア区切り文字)を含めることのボーナスポイント!

3
C ++でタイプリストの方法デカルト積を作成するにはどうすればよいですか?
自明です。 基本的に、次のようなタイプのリストがあるとします。 using type_list_1 = type_list<int, somestructA>; using type_list_2 = type_list<somestructB>; using type_list_3 = type_list<double, short>; タイプリストの可変数にすることができます。 デカルト積のタイプリストを取得するにはどうすればよいですか? result = type_list< type_list<int, somestructB, double>, type_list<int, somestructB, short>, type_list<somestructA, somestructB, double>, type_list<somestructA, somestructB, short> >; 私はここに与えられているように双方向のデカルト積を作成する方法について手を出しました:タイプリストのデカルト積を作成する方法?、しかしnウェイはそれほど簡単ではないようです。 とりあえずやっています... template <typename...> struct type_list{}; // To concatenate template <typename... Ts, typename... Us> constexpr auto …

3
可変個のテンプレート:グループで引数を展開
2つの引数を取る関数があります。 template <typename T1, typename T2> void foo(T1 arg1, T2 arg2) { std::cout << arg1 << " + " << arg2 << '\n'; } そして、その引数をペアで転送するべき可変部分: template <typename... Args> void bar(Args&&... args) { static_assert(sizeof...(Args) % 2 == 0); ( foo( std::forward<Args>(args), std::forward<Args>(args) ), ... ); // ^ Sends each argument twice, …

5
パラメーターパックのグループ化またはペア化された折り畳みを作成する方法は?
template<class Msg, class... Args> std::wstring descf(Msg, Args&&... args) { std::wostringstream woss; owss << Msg << ". " << ... << " " << args << ": '" << args << "' ";//not legal at all //or owss << Msg << ". " << args[0] << ": '" << args[1] << …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.