2011-02-07 4 views
0

나는 다음과 같은 문제가 있습니다C++ 전처리 및 과부하 문제

하는의 우리가

#define SET callMe 
#define COLUMN(x) #x 

이 우리 프로그램의 우리의 주요 블록에 우리가 다음 줄이 생각해 보자 : SET(COLUMN(price)="hi");을하는 전처리 실행 후
#callMe("price"="hi"); 

내가,874가 될 기능을 callMe 서명을 필요로 번역그래서 우리는 "price"="hi""price=hi"으로 만들고 무언가를 만들어서 callMe이 나머지 문제를 처리하도록합니다. 마지막으로 언급 한 것은이 모든 프로그램이 Table 클래스의 일부라는 것입니다.

내가 가진 유일한 옵션은 연산자를 오버로드입니다 = 때문에 원하는 하나에 번역 "price"="hi",하지만 난 내가 처음 생각했기 때문에 내가 과부하해야 것을 얻을 수없는 구성원으로 다음과 같은 과부하

#std::string operator=(std::string str)을하고 함수는 테이블 클래스의하지만 제대로 궤도에 그것을 얻을 수없는 것 같습니다.

내가 원하는 작업을 수행 할 수있는 단서가 있습니까?

+0

왜 이런 이유로 전처리기를 사용하고 있습니까? AST로 SQL 표현식을 구축 한 오버로드 된 연산자로 클래스 세트를 만드는 것이 훨씬 더 낫습니다. – Omnifarious

답변

3

이 점이 좋나요? 결과

#define SECOND_PASS(x) callMe(#x) 
#define COLUMN(x) x 
#define SET(x) SECOND_PASS(x) 

:

callMe("price=\"hi\""); 

이 기본적으로 문자열로 변환하기 전에 열을 제거하는 전처리를 가져옵니다.

+0

큰 도움이되고있는 것 같습니다 또한 "hi"대신에 정수가 있으면 도움이됩니다. 회신을 보내 주셔서 감사합니다. :) – gchatzip

+0

나는 이런 식으로 생각하고 있었지만 정확히 어떻게 작동하는지 정확히 알 수 없었습니다. – Omnifarious

0

당신은

#define SET(x) (CallMe(x))

PS 같은 의미 - 보통의 면책 조항을이이 추상 구문 트리를 만들 수있는 다양한 논리 연산자를 오버로드 클래스와 수행해야

+0

나는 위의 상태를 정의하는 것이 여전히 g ++을 실행하는 ok라고 생각한다. main.cpp는 callMe ("price"= "hi")를 생성한다. , 나는 전처리기에 대해 알고 있지만 그런 식으로해야한다. (답변 해 주셔서 감사합니다. – gchatzip

0

처리기를 사용하는 대신 실제로 수행하는 방법에 대한 수술. 그런 다음 다양한 SQL 표현식을 C++ 코드로 표현하고 추상 구문 트리를 가져 와서 SQL WHERE 절로 직렬화 할 수 있습니다.

매우 어렵지는 않지만 조심하면 상당히 효율적입니다. 전처리 기 hackery를 사용하여 SQL 표현식 빌더를 작성하는 것보다 훨씬 낫습니다.

+0

당신은 맞습니다.하지만 우리는 원래 전처리 방법으로 솔루션을 구성했습니다. 나는 원래 디자인을 변경할 시간이 없다고 생각합니다. 내가 해결할 수없는 문제에 대한 해결책, 단서를 많이 주셔서 감사합니다. 나중에 확실히 시도해 보겠습니다. – gchatzip

1

원하는 것을 얻으려면 코드를 SET(COLUMN(price)"=hi")으로 작성해야합니다.

내장형에 operator=()을 오버로드 할 수 없습니다. 이것은 다른 이유들 중에서도 정상 유지 보수를 위해 수행됩니다.

C++ 오버로드는 컴파일러가 다른 언어를 구문 분석하도록하기위한 것이 아닙니다.

P. Table 클래스의 operator=() 오버로드는 Table=의 왼쪽에있는 경우 만 처리합니다. 그럴 경우 COLUMN(x)Table 개체를 반환해야합니다. 아마도 원하는 것은 아닙니다. 어댑터 클래스를 사용하여이 효과를 얻을 수 있지만 COLUMN(x)의 구문에는이 열의 출처가 포함되어 있지 않으므로 여기에 붙어 있습니다.거기 솔루션은 다음과 같이 보일 것이다

방법 : 당신이 코딩 표준을 무엇에

class ColumnSetter 
{public: 
    ColumnSetter(const char* name): name(name), value(0) {} 
    ColumnSetter& operator=(const char* value_) { value = value_; } 
    operator std::string const &() const { std::string result(name); 
     if(value) { result.append('='); result.append(value); } return result; } 
private: 
    const char* name; 
    const char* value; 
}; 

#define COLUMN(x) ColumnSetter(#x) 

void callMe(const std::string& param); 

포맷하고 해제 인라인.

+0

알려 주셔서 고마워요. 나는 아직도 그 "가격"= "안녕" "가격 = 안녕", 나는 다른 것을 생각할 수없는 구문을 바꿀 수 없게 만들고 싶다면 어떤 실마리가 있습니까 : ( – gchatzip