是否可以使用条件运算符将输入流传递给函数?

Can I use conditional operator to pass an input stream to a function?

本文关键字:函数 输入流 可以使 条件运算符 是否      更新时间:2023-10-16

在某些情况下我不能使用if-else但只有我们可以使用conditional operator ?例如在成员初始化列表中,例如:

struct vector{
vector(int n) : sz_{n}, elem{ n ? new int[n] : nullptr }
{}
};

现在我有一个模板函数,它引用std::istreamstd::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);

你应该使指向函数参数返回的指针的返回类型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;