一些标准iomanip函数需要参数.
我想知道这是如何实现的,例如,我可以用函数做类似的事情吗?这真的是我需要这个答案的解决方案,但我无法弄清楚如何做到这一点.
当我查看setw函数的定义时,例如在http://en.cppreference.com中,它将返回类型列为"未指定",它也只列出一个参数,而不是stream&参数.这是如何运作的?
这个问题有一个很好的答案,但对于个人提出这个问题; 此答案仅在与以下功能结合使用时才有用ios_base:
在一个示例中vector<int> someVector,istringstream someStringStream你可以这样做:
for (int i=0; i < someVector.size(); i++) {
someStringStream >> someVector[i];
}
Run Code Online (Sandbox Code Playgroud)
我知道这vector<bool>是一个有效的实现,并operator[]返回一个引用对象.对于这段代码,我应该使用索引而不是迭代器,主要是为了提高可读性.目前,我正在使用这个:
for (int i=0; i < someVector.size(); i++) {
bool temp;
someStringStream >> temp;
someVector[i] = temp;
}
Run Code Online (Sandbox Code Playgroud)
是否有更直接的方式来实现这一点?
给定一个应该代表数字的字符串,我想把它放入一个转换函数,如果整个字符串没有转换就会提供通知.
输入"12"::
istringstream::operator>> 输出12atoi 输出12stoi 输出12对于输入,"1X"我想要一个失败的响应,但我得到:
istringstream::operator>> 输出1atoi 输出1stoi 输出1输入"X2":
istringstream::operator>> 输出0并设置错误标志atoi 输出0stoi 抛出错误[ 实例 ]
有没有办法在输入上引发错误行为"1X"?
在这个答案中,我有以下代码:
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <iterator>
#include <limits>
using namespace std;
struct station{
string _stationName;
int _studentPass;
int _adultPass;
};
std::istream& operator>>(std::istream& is, station& rhs){
getline(is, rhs._stationName, ';');
is >> rhs._studentPass >> rhs._adultPass;
return is;
}
int main(){
istringstream foo("4;\nSpadina;76 156\nBathurst;121 291\nKeele;70 61\nBay;158 158");
foo.ignore(numeric_limits<streamsize>::max(), '\n');
vector<station> bar{ istream_iterator<station>(foo), istream_iterator<station>() };
for (auto& i : bar){
cout << i._stationName << ' ' << i._studentPass << ' ' << i._adultPass << endl;
}
return …Run Code Online (Sandbox Code Playgroud) 当我遍历a时vector<bool>,我发现通过迭代器解除引用的元素被识别为它们是const.这是为什么?更改容器或元素类型,例如list<bool>或vector<short>,并且元素是非const.这段代码显示了我在说什么:
typedef bool T;
#define C vector
istringstream &operator>>(istringstream &iss, T &v)
{
cout << "non-const" << endl;
return iss;
}
istringstream &operator>>(istringstream &iss, const T &v)
{
cout << "const" << endl;
return iss;
}
istringstream &operator>>(istringstream &iss, C<T> &c)
{
for (C<T>::iterator it = c.begin(); it != c.end(); ++it)
{
iss >> *it;
}
return iss;
}
int main()
{
C<T> c(1);
istringstream iss("1");
iss >> c;
}
Run Code Online (Sandbox Code Playgroud)
因为vector<bool>,该程序将"const"打印到控制台.将顶部的typedef和manifest常量更改为除了这两个组合之外的任何内容,并打印"non-const".此外,如果我替换行,iss …
我如何阅读std::istream使用operator>>?
我尝试了以下方法:
void foo(const std::istream& in) {
std::string tmp;
while(in >> tmp) {
std::cout << tmp;
}
}
Run Code Online (Sandbox Code Playgroud)
但它给出了一个错误:
error: no match for 'operator>>' in 'in >> tmp'
Run Code Online (Sandbox Code Playgroud) 看来这应该是合法的:
decltype(declval<istream>().operator>>(declval<istream>(), declval<int>())) test;
Run Code Online (Sandbox Code Playgroud)
但是当我尝试编译时,我得到:
错误C2661 ::
std::basic_istream<char,std::char_traits<char>>::operator >>没有重载函数需要2个参数
难道我做错了什么?为什么这不评估istream?
编辑:
它已经指出的是,因为istream& istream::operator>>(int&)是一种方法,第一个值自动传递.
但是:decltype(declval<istream>().operator>>(declval<int>())) test;错误:
错误C2664 ::
std::basic_istream<char,std::char_traits<char>> &std::basic_istream<char,std::char_traits<char>>::operator >>(std::basic_streambuf<char,std::char_traits<char>> *)无法将参数1转换std::ios_base::iostate为std::basic_istream<char,std::char_traits<char>> &(__cdecl *)(std::basic_istream<char,std::char_traits<char>> &)
和decltype(istream::operator >> (declval<istream>(), declval<int>())) test;错误:
错误C2661 ::
std::basic_istream<char,std::char_traits<char>>::operator >>没有重载函数需要2个参数
如果在调用像input_stream >> i;这里i是算术型,抛出异常或设置badbit等,是保证i并没有改变?
我读了一个整数:
is >> myInteger;
Run Code Online (Sandbox Code Playgroud)
现在我想知道读了多少位数(我说的是可能的前导零).我怎样才能做到这一点?
我希望operator>>()任何"基础"类型和任何容器类型都有重载.这是我到目前为止:
typedef uintmax_t my_t;
template <typename T>
std::istringstream &operator>>(std::istringstream &iss, T &v)
{
static my_t um = 6009;
v = um++;
return iss;
}
template <template <class> class C, typename T>
std::istringstream &operator>>(std::istringstream &iss, C<T> &c)
{
for (typename C<T>::iterator it = c.begin(); it != c.end(); ++it)
iss >> *it;
return iss;
}
int main()
{
std::vector<uint32_t> vi(3);
std::istringstream iss;
iss >> vi;
for (std::vector<uint32_t>::iterator it = vi.begin(); it != vi.end(); ++it)
std::cout << *it << std::endl;
} …Run Code Online (Sandbox Code Playgroud) c++ containers templates operator-overloading extraction-operator