在某些情况下,我不能使用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()
之类的函数的指针。
然后我要在main中做与以前相同的事情:
readInput<>(std::getline, in ? in : std::cin, strLine);
答案 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;