Оператор typeof() в vc++

Я пишу некоторые вспомогательные функции для проекта, над которым я работаю. Я всегда хотел оператор typeof. Я знаю, что его нет в моей текущей IDE (visual studio '10), поэтому я пытаюсь написать для него реализацию. Это должно работать примерно так:

auto var = new typeof(<expression>);

Это должен быть тип, извлекаемый во время компиляции, основанный на выражении, и это должно быть возможно. С++ использует это при вызове аргументов шаблона, например:

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", "//Специальная функция ошибки VC8.0", "/ / Это использует хорошую функцию ошибки VC6.5 и VC7.1"). Мне не повезло?


person Shaggi    schedule 23.03.2012    source источник
comment
Я всегда хотел оператор typeof. Я знаю, что его нет в моей текущей среде IDE (visual studio '10) Да, он существует — он называется decltype.   -  person ildjarn    schedule 23.03.2012
comment
@ildjarn я люблю тебя, спасибо. не знаю, как я проглядел это. Что касается первого вопроса, однако...?   -  person Shaggi    schedule 23.03.2012
comment
Я не знаю, какой ответ вы ищете. Синтаксис недопустим. Вы хотите знать, почему это незаконно? Я не думаю, что кто-то, кто не входит в комитет ISO C++, может разумно ответить на этот вопрос.   -  person ildjarn    schedule 23.03.2012
comment
Учитывая предыдущий пример, допустимо использовать a::type, но не mya::type. Да, я думаю, мне интересно, почему, возможно, за этим стоит логическая причина?   -  person Shaggi    schedule 23.03.2012
comment
Возможно, но я сомневаюсь, что кто-либо, кто знает эту причину, пишет здесь.   -  person ildjarn    schedule 23.03.2012
comment
Типы существуют только во время компиляции. Доступ ко всему, что существует только во время компиляции, осуществляется с помощью :: (разрешение области видимости, поскольку области видимости существуют только во время компиляции). Ко всему, что существует во время выполнения, можно получить доступ с помощью . (членский доступ). На самом деле, классы не существуют и во время выполнения, это всего лишь несколько байтовых блоков, с которыми связаны определенные функции и члены которых находятся только на определенных смещениях. Во всяком случае, это моя интерпретация.   -  person Xeo    schedule 23.03.2012
comment
Обратите внимание, что decltype имеет некоторые проблемы в VS 2010. А именно, он, по-видимому, использует более старую версию предложения decltype и не поддерживает использование decltype для нестатических членов класса.   -  person Justin Time - Reinstate Monica    schedule 28.04.2016


Ответы (1)


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

person Xeo    schedule 23.03.2012