質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

2回答

2168閲覧

可変引数テンプレートのパラメータを一つずつ取得したい

kokurone

総合スコア0

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/04/09 01:29

C++ 可変引数テンプレートのパラメータを一つずつ先頭から取り出したい

テンプレート仮引数を明示的に指定して。
それらを一つずつ先頭から取り出したい

発生している問題・エラーメッセージ

visualstudio2019

1c2672 'Test11'一致するオーバーロードされた関数が見つかりませんでした 2c2783 void Test11(void):テンプレート 引数を 'T' に対して減少できませんでした

該当のソースコード

C++

1#include<iostream> 2 3template<class T, class ...Arg> 4void Test11() 5{ 6 std::cout << typeid(T).name() << std::endl; 7 if (sizeof...(Arg) != 0) { 8 Test11<Arg...>(); 9 } 10} 11 12template<class ...Args> 13void Test10() 14{ 15 Test11<Args...>(); 16} 17 18int main(){ 19 20Test10<int,float,int>(); 21 22return 0; 23} 24

補足情報(FW/ツールのバージョンなど)

visual studio 2019(v142)
SDKバージョン10.0
C++ 言語標準 ISO C++14標準

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

比較的有名な(たぶん)パラメータパックの展開テクニックがあります。

cpp

1#include<iostream> 2#include<typeinfo> 3 4template<class T> 5void Test11() 6{ 7 std::cout << typeid(T).name() << std::endl; 8} 9 10template<class ...Args> 11void Test10() 12{ 13 int swallow[] = {(Test11<Args>(), 0)...}; 14 // 配列swallowの初期化リストとして下記のように展開され 15 // {(Test11<int>(), 0), (Test11<float>(), 0), (Test11<double>(), 0)} 16 // 初期化リストでは最左要素から右に向かって順番に評価されるため 17 // Test11<int>() → Test11<float>() → Test11<double>() 18 // の順で関数が呼び出される 19 (void)swallow; // 未使用変数の警告抑制 20} 21 22int main() 23{ 24 Test10<int,float,double>(); 25}

詳細は記事「C++のパラメータパック基礎&パック展開テクニック」を参照ください。

投稿2021/04/09 08:23

編集2021/04/09 08:30
yohhoy

総合スコア6191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

パッと思いつくのはこれですかね.
もっといい方法があるかもしれません.

cpp

1#include<iostream> 2 3template<class T, class ...Arg> 4std::enable_if_t<sizeof...(Arg) == 0,void> Test11() { 5 std::cout << typeid(T).name() << std::endl; 6} 7 8template<class T, class ...Arg> 9std::enable_if_t<(sizeof...(Arg) > 0),void> Test11() 10{ 11 std::cout << typeid(T).name() << std::endl; 12 if (sizeof...(Arg) != 0) { 13 Test11<Arg...>(); 14 } 15} 16 17template<class ...Args> 18void Test10() 19{ 20 Test11<Args...>(); 21} 22 23int main() { 24 25 Test10<int, float, int>(); 26 27 return 0; 28}
//結果 int float int

c++17ならこれでも行けると思います

cpp

1 2#include<iostream> 3 4template<class T, class ...Arg> 5void Test11() 6{ 7 std::cout << typeid(T).name() << std::endl; 8 if constexpr (sizeof...(Arg) != 0) { 9 Test11<Arg...>(); 10 } 11} 12 13template<class ...Args> 14void Test10() 15{ 16 Test11<Args...>(); 17} 18 19int main(){ 20 21Test10<int,float,int>(); 22 23return 0; 24} 25

投稿2021/04/09 02:01

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問