Могу ли я использовать условный оператор для передачи входного потока в функцию? - PullRequest
3 голосов
/ 09 марта 2019

В некоторых случаях я не могу использовать 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);

1 Ответ

1 голос
/ 09 марта 2019

Вы должны сделать тип возврата указателя на возвращаемый аргумент функции T& не std::istream:

template<class T>
void readInput(T& (*pfn)(T&, std::string&), T& stream_in, std::string& sLine) {
    (*pfn)(stream_in, sLine);
}

А в основном вы можете:

readInput<>(std::getline, in ? in : std::cin, strLine);
std::cout << strLine << std::endl;
...