2017-12-21 11 views
-3

요소에 벡터가 있는지 확인하기 위해 매크로를 사용하는 코드 조각이 있습니다. 컴파일에 오류 다음 부여합니다어떤 컨테이너에서 어떻게 매크로 작업을 할 수 있습니까?

#define x.contains(a) x.find(a)!=x.end() 
void main(){ 
    vector<int> v = {1,2,3,4}; 
    if(v.contains(2)) 
     cout<<"yes"<<endl; 
    else 
     cout<<"no"<<endl; 
} 

그러나 :

ISO C++11 requires whitespace after the macro name #define x.contains(a) x.find(a)!=x.end() 

나에게 방법을 보여주십시오. 감사합니다. .

+6

가 _ "밖으로 나에게 방법을 보여주십시오."_ 사용 템플릿 기능을하지 매크로. 매크로는 결코 답이 될 수 없습니다. (* 가끔은 의미하지 않지만 사용자의 99.999 %는 사용하지 않습니다.) –

+4

매크로를 사용하면 처음에는 좋지 않습니다. 적절한 기능을 작성하십시오. –

+0

그런 매크로를 통해 클래스에 멤버를 추가 할 수 없습니다. 그리고 매크로를 일반적으로 피해야합니다. 간단한 템플릿으로 된'inline' 함수가 훨씬 더 좋을 것입니다. –

답변

1

매크로가 더 이상 해결책이 아닙니다.

#define contains(x,a) ((x).find(a)!=(x).end()) 
:이 방향으로 추구 그럼에도 불구하고 싶다면

, 당신은 대신 멤버 함수의 함수와 같은 매크로 보이게하고, 또한 연산자 우선 순위에 관련된 예상치 못한 효과를 피하기 위해 유일한 괄호를 사용할 필요가

하지만이 방법을 사용하면 매크로 대신 C++ 템플릿을 사용하지 않는 것이 유감입니다. 예 :

template <class T, class U> 
bool contains (const T& x, U a) { 
    return x.find(a)!=x.end(); 
} 

매크로에 비해 템플리트의 큰 이점 중 하나는 전문화를 정의 할 수 있다는 것입니다. 그런 다음 컴파일러는 가장 적합한 구현을 선택합니다. 예를 들어, 멤버 함수가 없기 때문에 매크로 버전이나 이전 예제 모두 <list>으로 작업 할 수 없습니다. 그러나 템플릿, 당신은보다 전문적인 버전을 정의 할 수 있습니다

template <class U> 
bool contains (const list<U>& x, U a) { 
    return std::find(x.begin(), x.end(), a)!=x.end(); 
} 

Online demo

+0

추가하려면 매크로를 사용하지 않기 위해이 게시물을 확인하십시오. https://stackoverflow.com/questions/14041453/why-are-preprocessor-macros-evros-and-what-are-the-alternatives – Carlos

+1

@Carlos 이 추가 참조 주셔서 감사합니다. 그 동안 OP가 '목록'에 '포함'을 사용하려는 경우 매우 구체적이고 구체적인 논증을 추가했습니다. – Christophe