2016-08-11 1 views
3

C++에서 매크로를 사용하지 않는 것이 좋습니다. 인라인 함수를 사용하여 함수와 유사한 매크로를 대체하고 constexpr/using을 사용하여 const-variable-define 매크로를 대체하십시오. 그러나 일부 현대적인 C++ 기술로 매크로 연결 기능을 대체 할 수있는 방법이 있는지 알고 싶습니다. 다음 매크로를 대체하는 방법을 예를 들어현대 C++ 기법으로 C++ 매크로 연결 바꾸기

:

#define GETTER_AND_SETTER(name)  \ 
    inline void Set##name(int value) \ 
    {        \ 
     m_##name = value;    \ 
    } 
    inline int Get##name() const  \ 
    {        \ 
     return m_##name;    \ 
    } 

는 수업 시간에, 나는 코드를보다 깨끗하게 만드는 많은 변수에 대해이 작업을 수행 할 수 있습니다.

GETTER_AND_SETTER(Variable1) 
GETTER_AND_SETTER(Variable2) 
GETTER_AND_SETTER(Variable3) 
... 

나는 herehere을 확인했다,하지만 난 대답을하지 않습니다. 이것에 대한 어떤 생각입니까? 감사합니다.

편집 : getters/setters의 예는 아이디어를 보여주기 위해 사용되었습니다. 제발 집중하지 마세요. :)

+0

아니요, 방법은 없습니다 :) – wasthishelpful

+5

문제는 당신이 당신의 수업을 getter와 setters가 필요한 데이터 덩어리로 취급한다는 것입니다. – StoryTeller

+1

매크로를 사용하는 경우에만 새 식별자를 만들 수 있습니다. – Quentin

답변

7

수 없습니다.

컴파일 타임에 변수 이름으로 수행 할 수있는 마법은 없습니다. C++에는 단순히 리플렉션 기능이 없습니다. 은 전처리기를 사용하여 마법을 수행하기 위해 코드를 생성 할 수 있습니다.

일반적인 해결 방법은 std::map 초의 값이 필요하지만, 현명한 접근 방법이 없다면 기존 접근 방식이 나에게 매우 합리적 인 것처럼 보입니다.

요구 사항에 따라 어쨌든이 "getter"/ "setter"를 잊어 버리고 클래스에 대한 논리적, 의미 론적 멤버 함수를 정의하는 것이 좋습니다. 문자 그대로 각 멤버 변수에 대한 직접 접근 자 및 뮤 테이터를 작성하는 경우 실제로는 what's the point?

+0

포인트 중 하나는 데이터 멤버를 정확히 읽거나 정확하게 쓰는 코드의 모든 위치를 찾는 것일 수 있습니다. (단지 직접 읽는다면 _accessed_ 만 찾을 수 있습니다.) 이것은 개인 데이터에 액세스 할 수있는 클래스의 자체 메소드에도 도움이되지 않습니다. 이것은 또한 클래스가 단지 개선 된 POD 것임을 암시합니다. – Ruslan

+0

@Ruslan : 아마도 같은 객체에 하나 또는 두 개의 코드 작성 공간이있는 경우 프로그램이 잘못 작성되었고 충분하지 않은'const'가 있습니다. 그래서 그것은 일종의 논점이됩니다. –

+0

답변 해 주셔서 감사합니다. 이것은 그 아이디어를 보여주는 예일뿐입니다. :) – houghstc