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]...
}
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]...
}
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;
}
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.
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 '[]'. –
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. –
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.
Kiedyś używałam wzoru singletonowego jak szalonego, ale potem przestałam, ponieważ kod singletonowy jest tak trudny do napisania testów. – jameszhao00
Nie, operatorzy nie mogą być statycznymi członkami klasy. Zamiast tego użyj zwykłej funkcji statycznej.
Jeżeli 'Class_1 [val]' otrzymując rodzaj? Jak się spodziewasz zrobić 'Class_1 [val] v;'? –
Miałem zamiar uzyskać wartości całkowe, ale typy są w porządku. – jameszhao00
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