Здравствуйте, niXman, Вы писали:
X>приветствую!
X>нужно перегрузить сабжевый оператор для того, чтоб все выводимые строки оборачивались в "\""
X>пытаюсь сделать такое: X>
X>template<typename T, bool ok = std::is_same<T, std::string>::value /*|| std::is_fundamental<T>::value*/>
X>std::ostream& operator<< (std::ostream& s, const T &o, typename std::enable_if<ok>::type* = 0) {
X> return s << o;
X>}
X>
X>на что компилятор мне говорит: X>
X>main.cpp:341:94: error: 'std::ostream& std::operator<<(std::ostream&, const T&, typename std::enable_if<ok>::type*)' must take exactly two arguments
X> std::ostream& operator<< (std::ostream& s, const T &o, typename std::enable_if<ok>::type* = 0) {
X>вопрос в том, как побороть?
X>благодарен!
похоже компилятор намекает, что operator<< может быть только бинарным
Re: специализация на основании type-traits для operator<<(...)
еще один вопрос по оператору вывода, и, чтоб не создавать еще одну мелкую тему, позвольте мне задать его тут
есть такая функция:
std::ostream& quoting(std::ostream &s, const std::string &o) {
return s << "\"" << o << "\"";
}
при попытке использовать ее так:
cout << "1:" << quoting("2");
получаю в выводе адрес функции, само собой.
есть ли способ, чтоб использование функции оставить таким как показано, но чтоб не адрес выводился, а квотнутая строка?
спасибо.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: специализация на основании type-traits для operator<<(...)
Здравствуйте, niXman, Вы писали:
X>Здравствуйте, andyp, Вы писали:
A>>похоже компилятор намекает, что operator<< может быть только бинарным X>это я понял. выше же написал об этом.
X>вопрос в том, каким образом специализировать этот оператор?
определи свой класс-враппер EscapedString (ну или еще что-то), хранящий ссылку на std::string и свой operator<< для этого класса. operator<< для std::string уже есть в стандартной библиотеке
Re[4]: специализация на основании type-traits для operator<<(...)
Здравствуйте, andyp, Вы писали:
A>определи свой класс-враппер EscapedString (ну или еще что-то), хранящий ссылку на std::string и свой operator<< для этого класса. operator<< для std::string уже есть в стандартной библиотеке
так это же весь код придется перелопатить!
я же хотел глобально переопределить.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: специализация на основании type-traits для operator<<(...)
Здравствуйте, niXman, Вы писали:
X>еще один вопрос по оператору вывода, и, чтоб не создавать еще одну мелкую тему, позвольте мне задать его тут
X>есть такая функция: X>
X>std::ostream& quoting(std::ostream &s, const std::string &o) {
X> return s << "\"" << o << "\"";
X>}
X>
X>при попытке использовать ее так: X>
X>cout << "1:" << quoting("2");
X>
X>получаю в выводе адрес функции, само собой. X>есть ли способ, чтоб использование функции оставить таким как показано, но чтоб не адрес выводился, а квотнутая строка?
X>спасибо.
std::string& quoting(const std::string &o) {
std::ostringstream s;
s << "\"" << o << "\"";
return s.str();
}
???
Re[3]: специализация на основании type-traits для operator<<(...)
Здравствуйте, niXman, Вы писали:
X>Здравствуйте, andyp, Вы писали:
A>>определи свой класс-враппер EscapedString (ну или еще что-то), хранящий ссылку на std::string и свой operator<< для этого класса. operator<< для std::string уже есть в стандартной библиотеке X>так это же весь код придется перелопатить! X>я же хотел глобально переопределить.
по идее можно свой operator<<(std::ostream&, std::string) определитьв нужном (например, глобальном) namespace
Re: специализация на основании type-traits для operator<<(...)
Здравствуйте, niXman, Вы писали:
X>нужно перегрузить сабжевый оператор для того, чтоб все выводимые строки оборачивались в "\"" X>пытаюсь сделать такое: X>
X>template<typename T, bool ok = std::is_same<T, std::string>::value /*|| std::is_fundamental<T>::value*/>
X>std::ostream& operator<< (std::ostream& s, const T &o, typename std::enable_if<ok>::type* = 0) {
X> return s << o;
X>}
X>
X>на что компилятор мне говорит: X>
X>main.cpp:341:94: error: 'std::ostream& std::operator<<(std::ostream&, const T&, typename std::enable_if<ok>::type*)' must take exactly two arguments
X> std::ostream& operator<< (std::ostream& s, const T &o, typename std::enable_if<ok>::type* = 0) {
X>вопрос в том, как побороть?
Тут сразу два соображения.
1. Если уж применять SFINAE, то лучше уж к результату функции в данном случае:
template<typename T, typename U>
using EnableIfString = typename std::enable_if<std::is_same<T, std::string>::value, U>::type;
template<typename T>
EnableIfString<T, std::ostream&> operator<< (std::ostream& s, const T &o) {
return s << "'" << o << "'";
}
2. SFINAE здесь нафиг не нужен:
std::ostream& operator<< (std::ostream& s, const std::string &o) {
using std::operator<<; // Без этого уйдем в бесконечную рекурсиюreturn s << "'" << o << "'";
}
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[2]: специализация на основании type-traits для operator<<(...)
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, niXman, Вы писали:
X>>нужно перегрузить сабжевый оператор для того, чтоб все выводимые строки оборачивались в "\"" X>>пытаюсь сделать такое: X>>
X>>template<typename T, bool ok = std::is_same<T, std::string>::value /*|| std::is_fundamental<T>::value*/>
X>>std::ostream& operator<< (std::ostream& s, const T &o, typename std::enable_if<ok>::type* = 0) {
X>> return s << o;
X>>}
X>>
X>>на что компилятор мне говорит: X>>
X>>main.cpp:341:94: error: 'std::ostream& std::operator<<(std::ostream&, const T&, typename std::enable_if<ok>::type*)' must take exactly two arguments
X>> std::ostream& operator<< (std::ostream& s, const T &o, typename std::enable_if<ok>::type* = 0) {
X>>вопрос в том, как побороть?
R>Тут сразу два соображения.
R>1. Если уж применять SFINAE, то лучше уж к результату функции в данном случае: R>
R>std::ostream& operator<< (std::ostream& s, const std::string &o) {
R> using std::operator<<; // Без этого уйдем в бесконечную рекурсию
R> return s << "'" << o << "'";
R>}
R>
там еще одна проблема будет —
#include <string>
#include <iostream>
std::ostream& operator<<(std::ostream& s , const std::string& ss)
{
using std::operator<<;
s<<'A';
s<<ss;
s<<'A';
return s;
}
int main(){
std::cout<<"1"<<std::endl;
}
будет использовать operator<< из std. Сработает только вот так std::string("1"), а это приведет к изменению кода во многих местах
Re[3]: специализация на основании type-traits для operator<<(...)
A>там еще одна проблема будет — A> . . . A>будет использовать operator<< из std. Сработает только вот так std::string("1"), а это приведет к изменению кода во многих местах
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, andyp, Вы писали:
A>>там еще одна проблема будет — A>> . . . A>>будет использовать operator<< из std. Сработает только вот так std::string("1"), а это приведет к изменению кода во многих местах
Здравствуйте, niXman, Вы писали:
X>еще один вопрос по оператору вывода, и, чтоб не создавать еще одну мелкую тему, позвольте мне задать его тут
X>есть такая функция: X>
X>std::ostream& quoting(std::ostream &s, const std::string &o) {
X> return s << "\"" << o << "\"";
X>}
X>
X>при попытке использовать ее так: X>
X>cout << "1:" << quoting("2");
X>
X>получаю в выводе адрес функции, само собой. X>есть ли способ, чтоб использование функции оставить таким как показано, но чтоб не адрес выводился, а квотнутая строка?
а по этому вопросу есть идеи?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[3]: специализация на основании type-traits для operator<<(...)
Здравствуйте, niXman, Вы писали:
X>>еще один вопрос по оператору вывода, и, чтоб не создавать еще одну мелкую тему, позвольте мне задать его тут
X>>есть такая функция: X>>
X>>std::ostream& quoting(std::ostream &s, const std::string &o) {
X>> return s << "\"" << o << "\"";
X>>}
X>>
X>>при попытке использовать ее так: X>>
X>>cout << "1:" << quoting("2");
X>>
X>>получаю в выводе адрес функции, само собой.
это странно, потому что я получаю ошибку компиляции при попытке преобразовать "const char *" к "std::ostream"
может ты что-то другое компилируешь?
X>>есть ли способ, чтоб использование функции оставить таким как показано, но чтоб не адрес выводился, а квотнутая строка?
X>а по этому вопросу есть идеи?
можешь сформулировать подробней, чего есть, и чего нужно.
Re[4]: специализация на основании type-traits для operator<<(...)