Operátor << u globalni funkce – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Operátor << u globalni funkce – C / C++ – Fórum – Programujte.comOperátor << u globalni funkce – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
ingiraxo+15
Grafoman
16. 9. 2012   #1
-
0
-

Ahoj, narazil jsem na problém u kterýho jsem se trochu zasek a docela by mě zajímalo jak to udělat.

Řekněme, že mám funkci která vrací void a zpracovává nějaký údaje a tato funkce je globální. A já bych chtěl, na tuto funkci přidat operátor <<

Mám to třeba takto: 

// deklarace funkce do globalniho prostoru bez tridy
static void Zpracuj();

// main.cpp (pouziti)
Zpracuj() << "zprava";

pokud bych ten text chtel vypsat tak vim jak to udelat, ale pokud ho nechci vypsat, ale pouze nejak zpracovat tak nejak nevim :/

případně pak umožnit více hodnot jako: Zpracuj() << "a" << "b" << "c";

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Reklama
Reklama
ondra.holub+1
Stálý člen
16. 9. 2012   #2
-
0
-

Funkce void Zpracuj() nebere žádný parametr a nic nevrací. Takže jí nic nemůžeš předávat.

Zpracuj() << cokoliv

je pak nesmysl, protože pro typ void (což je návratový typ funkce Zpracuj()) není definován operátor <<. A definovat ani nejde, protože by se to muselo napsat jako

void operator<<(void, const char* txt)
{
}

A to je nesmysl.

To, co je levým operandem operátoru << musí být třída nebo nějaký enum.

Nahlásit jako SPAM
IP: 85.207.23.–
ingiraxo+15
Grafoman
16. 9. 2012   #3
-
0
-

no, teď jsem to ještě nějakou dobu zkloušel a ona je to i blbost, protože jak by to poznalo, že myslim zrovna tuhle funkci a né jinou

takže  nejspíš jiná možnost, než to dát do nějaký struktůry neni..

takže jsem to udělal jako: 

#ifndef __testdef

struct AnyObj
{
    void operator << (LPCSTR msg)
    {
        // zpracovani
    }
} any;

#endif // __testdef

coz by melo fungovat, sice né přimo na funkci ale na promennou "any", ale ted nejak nechápu, proc mi kompilace pise redifinici (tu hlavičku includuju asi 6 souborech a vsude mam jeste pragmu)

jako pokud dám tu deklraci promenny "any" pryc, to to jede, ale nechapu proc to nejde, kdyz by se to stejne mělo natáhnou jenom jednou

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
yaqwsx+9
Posthunter
16. 9. 2012   #4
-
0
-

Moc nechápu, co by měl znamenat zápis Zpracuj() << "text". Co by se mělo s textem provést?

Od této otázky se nabízí řešení - funkce zpracuj by musela vracet nějakou hodnotu/třídu pro kterou by se nadefinoval globální operátor <<

Nahlásit jako SPAM
IP: 85.160.38.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
ingiraxo+15
Grafoman
16. 9. 2012   #5
-
0
-

#4 yaqwsx
já mám funkci ještě pro výpis "Vypis(string)" a pokoušel jsem si udělat další funkci, která by volala tu vypiš, ale přes operátor << 

// proste funkce pro vypis
void vypis(string msg) { cout << msg; }

// jakakoliv funkci, co by volala vypis(string)
void zpracuj(string msg = nullptr) { vypis(msg); }

// main.cpp
// pokus o pretizeni te funkce zpracuj, ktera vola vypis(string) a prave diky
// operatoru << ji preda parametr
zpracuj() << "neco";

chápu, že to je trochu přes ruku, ale napadlo mě to jestli to vubec nejak jde, kdyz ta funkce neni primo v nejakym objektu, ale jako globalni funkce

a ta funkce zpracuj klidne muze vrace bool, ne primo void, ono je to i jedno celkem, pac by vykonala pouze volani jine funkce, ktere preda parametr pres <<

ale asi to necham tak, jak jsem predtim napsal, jen me tohle reseni zajimalo :)

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
yaqwsx+9
Posthunter
16. 9. 2012   #6
-
0
-

#5 ingiraxo
Tak tohle udělat nejde. Prvně se totiž provede funkce zpracuj, která vrátí nějakou hodnotu. A teprve na tuto vrácenou hodnu (tzn. funkce zpracuj již byla provedena) se zavolá operátor <<

Proč nemůžeš použít parametr funkce? Je to logické a nematoucí.

Nahlásit jako SPAM
IP: 85.160.38.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
ingiraxo+15
Grafoman
16. 9. 2012   #7
-
0
-

#6 yaqwsx
však já používám parametr funkce, jen mě tohle napadlo a nějak mi to nešlo, tak jestli je to vůbec možný :)

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
metthal
~ Anonymní uživatel
27 příspěvků
16. 9. 2012   #8
-
0
-

To o co sa snazis je absolutne nelogicke.

Pokial sa snazis spravit nieco ako vlastny cout, tak si musis implementovat vlastny datovy typ (napriklad triedu), ktorej overloadnes ten operator << a pri jeho zavolani appendnes data do nejakeho bufferu.

Nahlásit jako SPAM
IP: 2001:67c:1220:c1a2:d1a2:9...–
KIIV+42
God of flame
16. 9. 2012   #9
-
0
-

   

#include <iostream>
#include <string>

using namespace std;


void test(string & a) {
  cout << a << endl;
}

template <class T>
T & operator<<( T & fn, string str) {
  fn(str);
  return fn;
}

int main() {
  test << string("abeceda") << string("dalsi retezec");
}

ale nedostanes tam zadny jiny typ nez ten, pro ktery je funkce test... (leda bys to zaonacil nejakym polymorfnim nad typem)

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ingiraxo+15
Grafoman
16. 9. 2012   #10
-
0
-

#9 KIIV
v cout << a << endl; nejde priradit "a" kvuli generice

ale už jsem to vyřešil takto: 

#include <iostream>
#include <string>

using namespace std;

typedef void (*Fce)(const string&);

void test(const string& str)
{
    cout << str << endl;
}

Fce operator << (Fce fce, const string str)
{
    fce(str);
    return fce;
}

int main()
{
    test << string("abeceda") << string("dalsi retezec");

    return 0;
}
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
KIIV+42
God of flame
16. 9. 2012   #11
-
0
-

jaky generice? tady mas presne danou funkci, ktera ma presne danej typ...

problem by spis nastal, kdyz bys udelal template - na zacatku bys mel treba neco jako    test<string> a ten se s tebou potahne az do konce... nic jinyho se tam stejne narvat neda..  vic sanci bys mel asi s funkcnim objektem... a tam asi stejne budes vypisovat typ po typu

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
KIIV+42
God of flame
16. 9. 2012   #12
-
0
-

ikdyz u funktoru to zda se nevadi :)

#include <iostream>
#include <string>

using namespace std;


class functor {
  public:
    template <class T> void operator()(T & item) { cout << item; cout << endl; }
} test;

/*
void test(string & a) {
  cout << a << endl;
}
*/

template <class T, class V>
T & operator<<( T & fn, V str) {
  fn(str);
  return fn;
}

int main() {
  test << string("abeceda") << string("dalsi retezec") << 123435;
}
Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 73 hostů

Podobná vlákna

Globální proměnné — založil Anonymní uživatel

Globální hook — založil Tepster

Globální proměnné — založil 3xore

Globální proměnné — založil Martin

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý