2009-09-07 8 views
8

Czy możliwe jest przeciążenie operatorów klas C++ w kontekście statycznym? na przykładPrzeciążanie statycznego operatora C++

class Class_1{ ... } 
int main() 
{ 

    Class_1[val]... 

} 
+0

Jeżeli 'Class_1 [val]' otrzymując rodzaj? Jak się spodziewasz zrobić 'Class_1 [val] v;'? –

+1

Miałem zamiar uzyskać wartości całkowe, ale typy są w porządku. – jameszhao00

+0

W C++ typy nie mogą być reprezentowane w systemie typów (jest tylko 'std :: typ_id') i nie mogę myśleć o żadnym operatorze, który może być przeciążony statycznie. Sugeruję, zamiast pytać, czy twój pomysł implementacji jest wykonalny w C++, przedstawiasz faktyczny _problem_, który miał rozwiązać. Ktoś może zaproponować wykonalną implementację. – sbi

Odpowiedz

13

Jeśli szukasz metaprogramowania za pomocą wbudowanego operatora: Takie rzeczy nie są możliwe - wbudowane operatory działają na wartościach wykonawczych, a nie na wartościach czasu kompilacji.

Można użyć boost::mpl za to, i zamiast korzystać z wbudowanych operatorów, wykorzystać swoje szablony, jak at dla op[], plus<a, b> dla op+ itp

int main() { 
    using boost::mpl::vector; 
    using boost::mpl::at_c; 
    using boost::mpl::plus; 
    using boost::mpl::int_; 

    typedef vector<int, bool, char, float> Class_1; 
    typedef vector< int_<1>, int_<2> > Numeric_1; 

    at_c<Class_1, 0>::type six = 6; 
    typedef plus<at_c<Numeric_1, 0>::type 
       ,at_c<Numeric_1, 1>::type>::type r; 
    int i3[r::value] = { 4, 5, 6 }; 
    return ((i3[0] + i3[1] + i3[2]) * six) == 90; 
} 
3

Jeśli masz na myśli operator pracuje w klasie, Nie, to nie ma sensu, to jakby powiedzieć operator + maja operatora na int lub double. Operatory są syntaktycznym cukrem dla funkcji i działają na varibles (wartości), a nie na typy.

+1

Ma sens, jeśli masz jakąś klasę użytkową - z tylko statycznymi elementami - która ładuje coś do "siebie", do którego następnie chciałbyś uzyskać dostęp w najprostszy sposób - używając operatora takiego jak '[]'. –

+1

Tak, dodanie do komentarza @ jave.web: z pewnością może mieć sens w przypadkach *, gdy istnieją dane w zakresie statycznym * klasy. (OP wyraźnie wymienia także zakres statyczny). A więc nie z prostą arytmetyką, jak w twoim przykładzie, ale rzeczy takie jak [],(), <<, >> itd. Mogą być doskonałym cukrem syntaktycznym również dla dowolnych złożonych klas menedżerskich. , bez wymuszania pojedynczej instancji. –

5

Nie wierzę, że to możliwe, choć mógłbym się mylić na tym froncie. Chciałbym zapytać, dlaczego chciałbyś to zrobić. Zamiast wykonywać operacje na klasie zamiast w instancjach, być może potrzebujesz tylko jednej instancji w całej aplikacji? W takim przypadku prawdopodobnie powinieneś używać the singleton pattern.

+1

Kiedyś używałam wzoru singletonowego jak szalonego, ale potem przestałam, ponieważ kod singletonowy jest tak trudny do napisania testów. – jameszhao00

1

Nie, operatorzy nie mogą być statycznymi członkami klasy. Zamiast tego użyj zwykłej funkcji statycznej.