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

时间:2019-03-08 21:01:02

标签: c++ conditional-operator

在某些情况下,我不能使用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()之类的函数的指针。

然后我要在main中做与以前相同的事情:

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

1 个答案:

答案 0 :(得分:1)

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