В некоторых случаях я не могу использовать if-else
, но только мы можем использовать conditional operator ?
, например, в списке инициализации члена, например:
struct vector{
vector(int n) : sz_{n}, elem{ n ? new int[n] : nullptr }
{}
};
Теперь у меня есть функция шаблона, которая принимает ссылку наstd::istream
или std::ifstream
объект и ссылка на std::string
.Так что предполагается, что эта функция читает входные данные из файла data.txt
;если ввод не удался, то объект потока файлов не удался, затем передайте std::cin
для чтения ввода со стандартного устройства ввода.
template<class T>
void readInput(T& in, std::string& str) {
std::getline(in, str);
}
int main(){
std::ifstream in("data.txt");
std::string strLine{};
readInput<>((in ? in : std::cin), strLine);
std::cout << strLine << std::endl;
std::cout << std::endl;
}
До этого все в порядке.Но я хочу использовать функцию readInput
, чтобы получить std::getline(T&, std::string)
Я имею в виду, что она берет указатель на std::getline
.Вот что я попробовал:
template<class T>
void readInput(std::istream& (*pfn)(T&, std::string&), T& stream_in, std::string& sLine) {
(*pfn)(stream_in, sLine);
}
Как вы можете видеть выше, возможно, я ошибаюсь в том, как перегрузить readInput
, так как он принимает указатель на функцию, подобную std::getline()
.
Тогда я хочу в основном сделать то же самое, что и раньше:
readInput<>(std::getline, in ? in : std::cin, strLine);