2012-03-23 2 views
0

Я пишу некоторые вспомогательные функции для проекта 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 "). Мне повезло?

+3

«* Мне всегда нужен оператор typeof. Я знаю, что он не существует в моей текущей среде IDE (visual studio '10) *« Да, это так - это называется '' decltype' '(http: // msdn.microsoft.com/en-us/library/dd537655.aspx). – ildjarn

+0

@ildjarn я люблю тебя спасибо. Не знаю, как я его не замечал. Что касается первого вопроса, хотя ...? – Shaggi

+0

Я не знаю, какой ответ вы ищете. Синтаксис является незаконным - вы хотите знать _why_ это незаконно? Я не думаю, что любой, кто не входит в комитет ISO C++, может разумно ответить на этот вопрос. – ildjarn

ответ

0

Объект не является областью действия. Оператор разрешения области (::) применим только к областям (область видимости класса, область пространства имен, область глобального пространства имен). Я дал немного дополнительной информации в качестве теории в комментарии по этому вопросу.

Смежные вопросы