2017-01-23 6 views
0

Я хотел бы проверить, соответствует ли полное имя и неквалифицированное или частично квалифицированное имя одному и тому же символу, даже если одно имя не определено. То есть, я хотел бы быть в состоянии написать что-то вроде этого, как часть инструмента рефакторинга:Как вы можете проверить, относится ли одно имя к тому же символу, что и другое?

namespace A { 
void f() {}; 
} 

namespace B { 
namespace A {}; 

    bool g() { 
    // returns false 
    return is_same_symbol<A::f, ::A::f>::value; 
    } 
} 

namespace C { 
    bool h() { 
    // returns true 
    return is_same_symbol<A::f, ::A::f>::value; 
    } 
} 
+1

«Я хотел бы проверить, чтобы проверить, относятся ли два разных символа к одному и тому же, даже если их не существует». Это не имеет большого смысла. –

+0

@NeilButterworth Да, я знаю, я не уверен, как это сделать. Я предполагаю, что лучше сказать, что «я хотел бы проверить, относится ли полное имя и неквалифицированное или частично квалифицированное имя к одному и тому же символу» –

+2

Если символ не определен и вы пытаетесь его использовать, вы получите ошибку компилятора, просто и просто. – AndyG

ответ

0

Вы пояснить в комментарии:

Я пытаюсь выяснить, правильно SFINAE для этого, чтобы проверить, существует ли свободная функция данного имени.

Вы не можете.

Когда вы говорите свободная функция называетсяfooсуществует, что вы имеете в виду?

Это должен быть один из:

Компилятор видел декларациюfoo:

... int foo(int i); 

или:

Компилятор видел определениеfoo:

... int foo(int i) { 
    ... 
    return ...; 
} 

Определение также является объявлением, поэтому, если компилятор не видел объявление foo, то он также не видел определения.

Предположим, вы пытаетесь использовать SFINAE-зонд, объявлен ли foo. Если компилятор даже не видел декларация foo затем любой последующий код вы пишете, что использует foo как имя будет вызывать ошибку компиляции в вене:

error: use of undeclared identifier 'foo' 

Вы не можете написать код для SFINAE-зонда объявляется foo, потому что вы не можете писать C++, который использует необъявленные имена, период.

Предположим, вы пытаетесь использовать SFINAE-зонд, является ли foo. Чтобы сделать это, сначала нужно иметь объявление из foo - либо тот, который вы написали, или тот, который у вас есть в каком-то заголовочном файле.

Но, конечно же, учитывая заявление о foo, компилятор не может сказать, является ли или нет определяется и не заботится, за исключением особых случаев, что функция объявлена ​​как static или inline или в анонимном пространстве имен. В противном случае это оставляет или не находит определение для компоновщика.

Вообще-то, SFINAE-зондирование существования функции определения также a non-starter. И даже если foo объявлен static или inline или в анонимном пространстве имен, и отсутствует определение в пределах единицы компиляции, любой кода, который использует fooв соответствии с его декларацией остается хорошо сформированный кодом; поэтому даже в тех случаях, когда SFINAE-зондирование для is-it-defined остается бессмысленным.

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

  • Нет связанных вопросов^_^