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';
}
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]
コメントを追加