Я пишу некоторые вспомогательные функции для проекта im, над которым работает. Мне всегда нужен оператор typeof. Я знаю, что этого не существует в моей текущей среде IDE (visual studio '10), поэтому я пытаюсь написать для нее реализацию. Он должен работать что-то вроде этого:Оператор Typeof() в vC++
auto var = new typeof(<expression>);
Это должно быть просто время компиляции извлекаемый типа на основе от выражения и должно быть возможным. C++ использует это, когда побуждающие аргументы шаблона, например:
template< typename A >
void foo(A unused) {
/* can be invoked like foo(5) with A = int */
typedef A type;
type * used = new type;
}
Так я думал, что я мог бы играть с макросами, классы и шаблоны .. что-то вроде этого:
#define typeof(expression) (_type_creater().inducer(expression)::type)
template<typename T>
class _type_holder{
public:
typedef T type;
};
class _type_creater{
public:
template< class B >
_type_holder<B> inducer(B _temp) {
/* Here compiler induces the templated expression and creates a typename out of it.
this we can use extract typename from _type_holder, except a instantiatet type apparantly
doesn't have access to typedef'd typenames.
*/
return _type_holder<B>();
}
};
Так что проблема в основном, что это незаконно:
struct a
{
typedef int type;
}
...
a mya;
new mya::type; //or mya.type
Итак, первый вопрос: почему это незаконно? Почему вы не можете извлекать имена типов из типов экземпляров? Второй вопрос, могу ли я сделать это вообще? Я пробовал искать повышение TYPEOF, но не мог этого толкнуть, и кажется, что он просто использует ошибки в компиляторах VC («//VC7.0 specific bugfeature», «//VC8.0 specific bugfeature», «//Это использует хороший VC6.5 и VC7.1 bugfeature "). Мне повезло?
«* Мне всегда нужен оператор typeof. Я знаю, что он не существует в моей текущей среде IDE (visual studio '10) *« Да, это так - это называется '' decltype' '(http: // msdn.microsoft.com/en-us/library/dd537655.aspx). – ildjarn
@ildjarn я люблю тебя спасибо. Не знаю, как я его не замечал. Что касается первого вопроса, хотя ...? – Shaggi
Я не знаю, какой ответ вы ищете. Синтаксис является незаконным - вы хотите знать _why_ это незаконно? Я не думаю, что любой, кто не входит в комитет ISO C++, может разумно ответить на этот вопрос. – ildjarn