std :: getlineをテンプレートタイプにするにはどうすればよいですか?

マロマロ
template <typename T>
T getUserInput(std::string prompt = "")
{
    T input;
    std::cout << prompt;
    if (std::is_same<T, std::string>::value)
    {
        std::getline(std::cin, input);
    }
    else
    {
        std::cin >> input;
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
    return input;
}

タイプが文字列の場合(空白を含めるため)、cinの代わりにgetlineを使用しようとしていますが、std :: getlineに十分な引数を指定しなかったというエラーが多数表示されます。私もこれをやろうとしました:

    if (std::is_same<T, std::string>::value)
    {
        std::string sInput = "";
        std::getline(std::cin, sInput);
        return sInput;
    }

しかし、「std :: string」から「T」に変換できないというエラーが表示されます。Tをstd :: stringとして扱うようにするにはどうすればよいですか?

編集:これが私がそれを呼んでいる方法です:

int main()
{
    int x = getUserInput<int>("Please type a number: ");
    std::cout << x << '\n';
    std::string test = getUserInput<std::string>("Please type a string: ");
    std::cout << test << '\n';
}
cigien

T以外std::string関数を呼び出すと、getline分岐が行われるかどうかに関係なくすべてのコードをコンパイルする必要があるため、コードはコンパイルされません。

getline必要のないときにブランチをコンパイルしないif constexprようにするには、次のように使用できます

if constexpr (std::is_same_v<T, std::string>)
{
    std::getline(std::cin, input);
}
else
{
    std::cin >> input;
}

これがデモです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

テンプレートを使用してstd :: functionのパラメータータイプを推測するにはどうすればよいですか?

分類Dev

std :: string用にテンプレートを特殊化するにはどうすればよいですか

分類Dev

テンプレートでstd関数を使用するにはどうすればよいですか?

分類Dev

テンプレート引数でstd :: is_podを使用するにはどうすればよいですか?

分類Dev

戻り値がテンプレートタイプの場合、std :: result_ofを使用するにはどうすればよいですか?

分類Dev

テンプレートのデフォルトパラメータとしてstd :: vectorを設定するにはどうすればよいですか?

分類Dev

std :: Variantを指定してテンプレートパラメータパックを取得するにはどうすればよいですか?

分類Dev

std :: chrono :: durationをテンプレートパラメータとして使用するにはどうすればよいですか?

分類Dev

std :: unique_ptrの有効なC ++エイリアステンプレートを作成するにはどうすればよいですか?

分類Dev

可変個引数テンプレートを使用してstd :: variantをstd :: visitで続行するにはどうすればよいですか?

分類Dev

次のテンプレートを使用してマップのイテレータを宣言するにはどうすればよいですか?std :: map <std :: string、T> my_map?

分類Dev

可能であれば、可変個引数テンプレートを使用して、任意のタイプの複数のstd :: vectorを並べて出力する関数を作成するにはどうすればよいですか?

分類Dev

テンプレートに3つあるのに、std :: chrono :: duraction_castでタイプパラメータを1つだけ指定するにはどうすればよいですか?

分類Dev

std :: mapイテレータを進めてforループを停止するにはどうすればよいですか?

分類Dev

テンプレートパラメータがstd :: vectorの場合に使用される、このメソッドのテンプレートバージョンを作成するにはどうすればよいですか。

分類Dev

テンプレートを複数の `std :: array`に適用するにはどうすればよいですか?

分類Dev

std :: mapのイテレータを特定の数だけデクリメントするにはどうすればよいですか?

分類Dev

#![no_std]でクレートをテストするにはどうすればよいですか?

分類Dev

ループを使用せずにstd :: array内のアイテムのインデックスを取得するにはどうすればよいですか?

分類Dev

std :: enable_ifを使用して、テンプレートの種類に応じてコンストラクターを有効または無効にするにはどうすればよいですか?

分類Dev

テンプレート化された関数の引数としてstd :: getを渡すにはどうすればよいですか?

分類Dev

Javaランタイムを使用してPythonスクリプトからstd出力を出力するにはどうすればよいですか?

分類Dev

Ubuntuにmingw-std-threadsをインストールするにはどうすればよいですか?

分類Dev

コンストラクターでstd :: optionalを使用するにはどうすればよいですか?

分類Dev

この3つのc ++テンプレート関数をユニバーサルリファレンスまたはstd :: forwardによって1つにマージするにはどうすればよいですか?

分類Dev

std イテレータのデストラクタを明示的に呼び出すにはどうすればよいですか?

分類Dev

要素タイプがコピーできないstd :: vectorにn個の連続した要素を挿入するにはどうすればよいですか?

分類Dev

std :: unique_ptrカスタムデリータとして使用するために、noexcept-detectable、callableオブジェクトで関数をラップするクラステンプレートを作成するにはどうすればよいですか?

分類Dev

std :: atomicの配列をエレガントに初期化するにはどうすればよいですか?

Related 関連記事

  1. 1

    テンプレートを使用してstd :: functionのパラメータータイプを推測するにはどうすればよいですか?

  2. 2

    std :: string用にテンプレートを特殊化するにはどうすればよいですか

  3. 3

    テンプレートでstd関数を使用するにはどうすればよいですか?

  4. 4

    テンプレート引数でstd :: is_podを使用するにはどうすればよいですか?

  5. 5

    戻り値がテンプレートタイプの場合、std :: result_ofを使用するにはどうすればよいですか?

  6. 6

    テンプレートのデフォルトパラメータとしてstd :: vectorを設定するにはどうすればよいですか?

  7. 7

    std :: Variantを指定してテンプレートパラメータパックを取得するにはどうすればよいですか?

  8. 8

    std :: chrono :: durationをテンプレートパラメータとして使用するにはどうすればよいですか?

  9. 9

    std :: unique_ptrの有効なC ++エイリアステンプレートを作成するにはどうすればよいですか?

  10. 10

    可変個引数テンプレートを使用してstd :: variantをstd :: visitで続行するにはどうすればよいですか?

  11. 11

    次のテンプレートを使用してマップのイテレータを宣言するにはどうすればよいですか?std :: map <std :: string、T> my_map?

  12. 12

    可能であれば、可変個引数テンプレートを使用して、任意のタイプの複数のstd :: vectorを並べて出力する関数を作成するにはどうすればよいですか?

  13. 13

    テンプレートに3つあるのに、std :: chrono :: duraction_castでタイプパラメータを1つだけ指定するにはどうすればよいですか?

  14. 14

    std :: mapイテレータを進めてforループを停止するにはどうすればよいですか?

  15. 15

    テンプレートパラメータがstd :: vectorの場合に使用される、このメソッドのテンプレートバージョンを作成するにはどうすればよいですか。

  16. 16

    テンプレートを複数の `std :: array`に適用するにはどうすればよいですか?

  17. 17

    std :: mapのイテレータを特定の数だけデクリメントするにはどうすればよいですか?

  18. 18

    #![no_std]でクレートをテストするにはどうすればよいですか?

  19. 19

    ループを使用せずにstd :: array内のアイテムのインデックスを取得するにはどうすればよいですか?

  20. 20

    std :: enable_ifを使用して、テンプレートの種類に応じてコンストラクターを有効または無効にするにはどうすればよいですか?

  21. 21

    テンプレート化された関数の引数としてstd :: getを渡すにはどうすればよいですか?

  22. 22

    Javaランタイムを使用してPythonスクリプトからstd出力を出力するにはどうすればよいですか?

  23. 23

    Ubuntuにmingw-std-threadsをインストールするにはどうすればよいですか?

  24. 24

    コンストラクターでstd :: optionalを使用するにはどうすればよいですか?

  25. 25

    この3つのc ++テンプレート関数をユニバーサルリファレンスまたはstd :: forwardによって1つにマージするにはどうすればよいですか?

  26. 26

    std イテレータのデストラクタを明示的に呼び出すにはどうすればよいですか?

  27. 27

    要素タイプがコピーできないstd :: vectorにn個の連続した要素を挿入するにはどうすればよいですか?

  28. 28

    std :: unique_ptrカスタムデリータとして使用するために、noexcept-detectable、callableオブジェクトで関数をラップするクラステンプレートを作成するにはどうすればよいですか?

  29. 29

    std :: atomicの配列をエレガントに初期化するにはどうすればよいですか?

ホットタグ

アーカイブ