Возможно ли вложение перегруженных операторов? Я хотел бы вложить << внутри ()
template<class T>
struct UnknownName
{
T g;
T&operator<<(std::ostream&os, const T&v){return os<<v;}
bool operator()(const T&v)
{
if(v==g)
//do the streaming << then return true
else return false;
}
};
Не могли бы вы мне помочь? Боюсь, мой пример для вас достаточно нереален, просто спросите, остались ли у вас сомнения. Искренне.
2 ответа
Лучшее, что я могу придумать, - это чтобы operator<<
возвращал определенный тип, а затем перегружал operator()
, чтобы принять этот тип:
#include <cstdio>
namespace {
struct Foo {
struct Bar {
int i;
};
Foo& operator()(const Bar& b)
{
std::printf("bar, %d\n", b.i);
return *this;
}
// obviously you don't *have* to overload operator()
// to accept multiple types; I only did so to show that it's possible
Foo& operator()(const Foo& f)
{
std::printf("foo\n");
return *this;
}
};
Foo::Bar operator<<(const Foo& f, const Foo& g)
{
Foo::Bar b = { 5 };
return b;
}
}
int main()
{
Foo f, g, h;
f(g << h);
f(g);
}
Это не обычная идиома, мягко говоря.
Я не могу точно сказать, о чем вы спрашиваете, но я предполагаю, что вы имеете в виду написать класс для ostream&
, который передается в operator<<
. Сначала вы должны придумать способ преобразования T
в строковое представление. Я предполагаю, что это делает функция TToString
.
template<class T>
struct UnknownName
{
T g;
bool operator()(const T&v)
{
if(v==g) {
cout << v;
return true;
}
return false;
}
friend std::ostream& operator<<(std::ostream& os, const T& v) {
return os << TToString(v);
}
};
Извините, если я неверно истолковал ваш вопрос.
Похожие вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .