Страница 1 из 1
Вопрос по C++
Добавлено: 04 окт 2006, 12:26
sz
А есть способ превратить параметр темплейта в строку?
Как в дефайнах делается:
#define string(x) #x
Нужен аналог для темплейтов, типа:
template<class T>
class MyClass
{
public:
const char* GetParameterName() const { return #T; }
}
Есть там что нибудь? Пытался в гугле поискать, но он столько мусору вываливает, что совершенно невозможно.
Добавлено: 04 окт 2006, 13:18
aissp
Строгий ответ - нет. Аналога нет. ты можешь воспользоваться typeinfo но ето видимо не то что тебе надо + накладные расходы, да и более того компиляторы не гарантируют что имя полученное посредством тайпинфо буде ожидаемым для тебя. Но, предположу, что раз ьебя дефине не устраивает чем-то, тебе нужно что-то другое. Что именно?
Добавлено: 04 окт 2006, 13:39
anton2
Как вариант, можно использовать такие костыли (препроцессор, но по-другому, имхо, никак):
template<class T>
class MyClass
{
std::string _name;
public:
MyClass(std::string name = "") : _name(name) {}
const char* GetParameterName() const { return _name.c_str(); }
};
#define declare(C, T, v) C<T> v(#T)
int main()
{
declare(MyClass, int, m);
std::cout << m.GetParameterName() << std::endl;
return 0;
}
Добавлено: 04 окт 2006, 14:33
sz
Спасибо. В общем, похоже, кроме tipeof, вариантов нет.
Прискорбно, потому что у нас rtti в проекте отключен. Изменить настройки билда у меня нет возможности.
Придется решать через виртуальные функции. Подробности примерно такие:
template<class T>
class Base
{
static int SomeClassSpecificVar;
virtual void OverrideMe()
{
ASSERT( false, "OverrideMe is not overriden" );
}
};
class Derived1 : public Base<Derived1>
{
void OverrideMe() { printf( "Derived1\n" ); }
}
В общем, там большое количество наследников, которые составляют дерево, и у них эта виртуальная функция вызывается рекурсивно. В общем, у меня вылетает assert, а кто это, собственно, не имплементировал - это вопрос вопросов.
При этом все осложняется тем, что есть классы которые и не должны ее имплементировать, потому что в это дерево им не положено.
Передизайнить этот бардак я тоже не имею права - меня в этот проект помогать прислали, а не переделывать все. Придется дебагером допрыгивать до точки. А это долго. Не говоря уже о том, что дебагеры хуже, чем у ps3, конечно, бывают, но мне не встречались. Редкий глюкодром, который, кроме всего прочего, иногда задумывается на десяток секунд при простой команде step.
Можно, конечно, пройти по всей иерархии и добавить виртуальную GetClassName. Но я не уверен, что это будет быстрее, чем протрейсить.
Ладно, запасемся терпением.
Добавлено: 04 окт 2006, 15:20
aissp
Я все таки не понял проблемы. Правильно ли я понимаю? Существует большое количество наследников от класса Base в котором имплементирована функция func
Некоторые наследники должны перегружать ее а некоторые нет, причем те наследники которые не перегружают ее не должны ее и вызывать. Проблема состоит в том чтобы найти наследника который вызывает именно ету функцию (не пергрузил ее собака) но неохота ковыряться в коде а также не пользуюся макросами __file and __line
Так? Ты просто дал решение без задачи

Добавлено: 04 окт 2006, 16:16
sz
Да _file и _line - можно пользоваться. rtti нельзя.
Да ладно, наплюй, я ее уже нашел.
Добавлено: 04 окт 2006, 18:54
ajkj3em
Старина Зотин писал(а):
virtual void OverrideMe()
{
ASSERT( false, "OverrideMe is not overriden" );
}
не проще ли ее сделать = 0;
Передизайнить этот бардак я тоже не имею права - меня в этот проект помогать прислали, а не переделывать все.
я улавливаю нотки сожаления ...
