我知道之前已经问过这个问题,但我没有找到任何有希望的答案,而且案件与我的不同。
#include <iostream>
#include <string>
#include <algorithm>
#include <functional>
#include <type_traits>
template<class getN>
getN getNum(std::string prompt, std::function<bool(getN)> condition, std::string error)
{
std::cerr << prompt;
std::string strNum;
std::getline(std::cin, strNum);
try
{
size_t pos;
getN num;
if (std::is_integral<getN>::value == true)
{
num = static_cast<getN>(stoi(strNum, std::addressof(pos)));
}
else
{
num = static_cast<getN>(stof(strNum, std::addressof(pos)));
}
if (all_of(strNum.begin() + pos, strNum.end(), [](char c) { return isspace(c); }) && condition(num))
{
return num;
}
}
catch (std::exception) {}
std::cerr << error;
return getNum(prompt, condition, error);
}
void fillArray(float *arr, int size)
{
std::cout << "\nFill the array:\n";
for (int i = 0; i < size; i++)
{
std::cout << "arr[" << i + 1 << "]=";
arr[i] = getNum<float>("", [](bool num) {return num != 0.0f; }, "Bad input! Try again: ");
}
}
int main()
{
int size;
std::cout << "Size: ";
std::cin >> size;
float *arr = new float[size];
fillArray(arr, size);
delete[] arr;
std::cin.ignore();
std::cin.get();
return 0;
}
调用带有“int”的函数,就像最后一个语句一样,不会给我任何错误或警告,但是像fillArray函数一样用“float”调用它会把C4800抛给我。
答案 0 :(得分:2)
您已声明getNum
功能:
getN getNum(std::string prompt, std::function<bool(getN)> condition, std::string error)
取一个函数,返回bool
的{{1}}值。
然后用它来调用它:
condition
传递arr[i] = getNum<float>("", [](float num) {return num; }, "Bad input! Try again: ");
返回值。虽然编译器可以将float
转换为float
,但它不如从函数中获取bool
返回值有效。所以使用:
bool
相反,它不应该抱怨。
此外,将来,最好生成一个可以编译的COMPLETE程序(即,需要所有[](float num) -> bool {return num != 0.0f; }
,以及执行代码的#include
函数)这样,有人可以只需要你的代码,编译它并进行一些微小的修改来修复问题,而不必猜测需要什么标题以及你打算如何使用你发布的东西。