Вопрос

Если я определил класс:

class Blah {};

Как я могу:

std::string const className = /* What do I need to do here? */;
assert( className == "Blah" );

Я не думаю, что typeid (). Name () - хорошая идея, так как это Реализация компилятора специфический. Есть ли что -нибудь предоставленное стандартом C ++ или Boost?

ПРИМЕЧАНИЕ. Если бы класс был унаследован от QT QBject, я мог бы легко использовать QMetaObject::className() Чтобы получить имя класса.

Это было полезно?

Решение

Как это:

class Blah { static std::string const className() { return "Blah"; }};

std::string const name = Blah::className();
assert(name == "Blah");

Или это:

class Blah {};

template < typename T > struct name;
template < > struct name<Blah> { static std::string value() { return "Blah"; }};

std::string const classname = name<Blah>::value();
assert(classname == "Blah");

Фанцера:

#define DECLARE_NAMED_CLASS( Name ) \
struct Name;\
template < > struct name<Name> { static std::string value() { return #Name; }};\
struct Name

DECLARE_NAMED_CLASS(Blah) {};
std::string const className = name<Blah>::value();
...

Или это:

class Blah : QObject { Q_OBJECT };

Или это: ... или это: ...

Другие советы

Тестирование класса, глядя на это имя, звучит ужасно, как подход в стиле Java для меня, и в C ++ вы должны осторожно пытаться применить те же шаблоны! Лучшим способом было бы использовать что -то вроде boost::type_traits, и возможно is_same, с настоящим именем класса.

Я думаю dynamic_cast может быть то, что вы ищете. Это не дает вам названия класса, но не удается так, как вы хотели бы, чтобы ваше утверждение не удалось, за исключением подклассов Blah не будет пойман.

Я не думаю, что есть какое-либо некоммпиляторное решение такой проблемы, которое не включает в себя много макросов в объявлении класса (на самом деле, если я правильно понял документацию QT, которую вы получаете с objectName фактически назначается «вручную», я думаю, с кодом, созданным moc).

С другой стороны, в целом, чтобы проверить, является ли класс объекта, который вы не хотите, чтобы вы не должны выполнять сравнение строк, а вместо этого провести сравнение TypeID.

assert(typeid(YourObject)==typeid(Blah));

Но, вероятно, вы должны лучше объяснить, чего вы пытаетесь достичь.

Метод QObject-> metaObject () действителен для QT, за исключением классов на основе QGraphicSITEM, которые не наследуют от QObject ...

Я не думаю, что TypeId (). Name () - хорошая идея, так как это специфическая для реализации компилятора.

Да, стандарт не требует от реализации для использования какого -либо конкретного именования, поэтому оно может измениться даже для того же компилятора.

Есть ли что -нибудь предоставленное стандартом C ++ или Boost?

Нет стандартных средств, которые бы возвращали имя класса в какой -то канонической форме.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top