LINUX.ORG.RU

c++ использование объекта класса в switch

 , , ,


1

4

Добрый день. А как бы сделать так, чтобы можно было бы использовать объект в switch вместе со значениями из enum:

//...
enum Type {
    Type1,
    Type2
};

//...

SomeClass a;

//...

switch (a) {
    case Type1:
    //...
    break;
    
    case Type2:
    //...
    break;
}

★★★★★

а по русски ?

anonymous
()

Ответ простой и надеюсь вам понравится тем, что не надо ничего особенного делать: никак.

Partisan ★★★★
()
#include <iostream>

enum class Type {
	Type1,
	Type2
};

struct SomeClass {
	SomeClass(Type type) : _type(type) {}
	operator Type() { return _type; }
private:
	Type _type;
};

int main() {
	SomeClass a(Type::Type2);
	switch(a) {
	case Type::Type1:
		std::cout << "Type1\n";
		break;
	case Type::Type2:
		std::cout << "Type2\n";
	}
	return 0;
}
anonymous
()
Ответ на: комментарий от anonymous

Это будет работать? Я думал, такое можно делать только для стандартных типов (operator bool() / operator int()). Спасибо. А есть ссылка на стандарт или документ, который это описывает?

rumgot ★★★★★
() автор топика
Ответ на: комментарий от shdown

Согласен. Можно и через геттеры.

anonymous
()
Ответ на: комментарий от shdown

Совершенно согласен. Вопрос скорее ради спортивного интереса.

rumgot ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Это понял. А может еще есть ссылка на описание того, что можно определять operator Type(), где Type - это свой тип?

rumgot ★★★★★
() автор топика
Ответ на: комментарий от rumgot

Лучше забудь про этот способ, равно как и про неявное приведение типов вообще. Неявный кастинг — плохая практика.

Crocodoom ★★★★★
()
Ответ на: комментарий от Crocodoom

Там еще вариант с explicit есть.

rumgot ★★★★★
() автор топика
Ответ на: комментарий от Crocodoom

Про неявное преобразование я согласен. Тут скорее спортивный интерес.

rumgot ★★★★★
() автор топика

в ООП switch по типу заменяют виртуальными функциями

next_time ★★★★★
()
Ответ на: комментарий от anonymous

уёбищное спп гуано. во как нада:

type Element1() =
  class
    interface Element with
      member x.accept (a : Visitor) = a.visit(x)
  end
and Element2() =
  class
    interface Element with
      member x.accept (a : Visitor) = a.visit(x)
  end
and Element =
  interface
    abstract member accept : Visitor -> unit
  end
and Visitor =
  interface
    abstract member visit : Element1 -> unit
    abstract member visit : Element2 -> unit
  end


type VisitorImpl() =
  interface Visitor with
    member x.visit (e : Element1) = printfn "e1"
    member x.visit (e : Element2) = printfn "e2"

let() =
  let (vis, el1, el2) = (new VisitorImpl(), new Element1(), new Element2()) in
  (el1 :> Element).accept(vis);
  (el2 :> Element).accept(vis)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.