标签: extraction-operator

如何实现iomanip功能?

一些标准iomanip函数需要参数.

我想知道这是如何实现的,例如,我可以用函数做类似的事情吗?这真的是我需要这个答案的解决方案,但我无法弄清楚如何做到这一点.

当我查看setw函数的定义时,例如在http://en.cppreference.com中,它将返回类型列为"未指定",它也只列出一个参数,而不是stream&参数.这是如何运作的?

读者注意:

这个问题有一个很好的答案,但对于个人提出这个问题; 此答案仅在与以下功能结合使用时才有用ios_base:

c++ setw insertion extraction-operator iomanip

8
推荐指数
1
解决办法
1335
查看次数

如何使用向量<bool>的提取运算符(>>)?

在一个示例中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)

是否有更直接的方式来实现这一点?

c++ vector extraction-operator c++11

7
推荐指数
2
解决办法
265
查看次数

强制String到int函数消耗整个字符串

给定一个应该代表数字的字符串,我想把它放入一个转换函数,如果整个字符串没有转换就会提供通知.

输入"12"::

  • istringstream::operator>> 输出12
  • atoi 输出12
  • stoi 输出12

对于输入,"1X"我想要一个失败的响应,但我得到:

  • istringstream::operator>> 输出1
  • atoi 输出1
  • stoi 输出1

输入"X2":

  • istringstream::operator>> 输出0并设置错误标志
  • atoi 输出0
  • stoi 抛出错误

[ 实例 ]

有没有办法在输入上引发错误行为"1X"

c++ string atoi string-conversion extraction-operator

6
推荐指数
1
解决办法
508
查看次数

输出中出现意外的换行符

这个答案中,我有以下代码:

#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)

c++ cout line-breaks extraction-operator c++11

3
推荐指数
1
解决办法
146
查看次数

为什么非const vector <bool>元素是const?

当我遍历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 …

c++ boolean const vector extraction-operator

2
推荐指数
2
解决办法
204
查看次数

如何从std :: istream中读取(使用operator >>)?

我如何阅读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)

c++ operators istream extraction-operator

2
推荐指数
1
解决办法
1605
查看次数

为什么我不能在提取运算符上执行decltype

看来这应该是合法的:

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::iostatestd::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个参数

c++ decltype compile-time extraction-operator c++11

2
推荐指数
1
解决办法
85
查看次数

是否保证标准提取运算符>>在失败的情况下不会改变参数?

如果在调用像input_stream >> i;这里i是算术型,抛出异常或设置badbit等,是保证i并没有改变?

c++ extraction-operator

1
推荐指数
1
解决办法
76
查看次数

C++提取运算符:如何知道读取的位数?

我读了一个整数:

is >> myInteger;
Run Code Online (Sandbox Code Playgroud)

现在我想知道读了多少位数(我说的是可能的前导零).我怎样才能做到这一点?

c++ extraction-operator

1
推荐指数
1
解决办法
103
查看次数

如何强制运算符>>(C <T>)重载以匹配容器?

我希望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

0
推荐指数
1
解决办法
127
查看次数