2011-02-07 2 views
0

У меня есть следующая проблема:C++ препроцессор и перегружающие вопросы

Давайте рассмотрим мы

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

и в нашем главном блоке нашей программы мы имеем следующую строку: SET(COLUMN(price)="hi"); который после препроцессора бега переведен на:

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

Я нужна функция callMe подпись быть callMe(string str), поэтому нам нужно сделать что-то, чтобы сделать "price"="hi" до "price=hi" и позволить функции callMe справиться с остальной частью проблемы. Последнее, что нужно сказать, это то, что вся эта программа, которую я описываю, является частью класса Table.

Единственный вариант у меня есть перегрузка оператора = так "price"="hi" переводится на один хотел, но я не могу получить то, что я должен перегружать, потому что я сначала подумал, что делает такую ​​перегрузку

#std::string operator=(std::string str) в качестве члена функция класса Table, но, похоже, я не могу понять это правильно.

Любые подсказки, как я могу достичь желаемых операций?

+0

Почему вы используете препроцессор для этого? Было бы намного лучше создать набор классов с перегруженными операторами, которые создали SQL-выражение как AST. – Omnifarious

ответ

3

Этот продукт вам подходит?

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

что приводит:

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

Это по существу получает препроцессор удалить столбец перед преобразованием в строку.

+0

Кажется, потому что он также помогает, если вместо «привет» у нас есть целое число. Спасибо за ответ :) – gchatzip

+0

Я думал о чем-то подобном, но не мог точно понять, как заставить его работать. – Omnifarious

0

Вы имеете в виду, как

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

пс - обычный отказ от ответственности об использовании препроцессора

+0

Я думаю, что определение i state выше все еще нормально, выполнение g ++ -E main.cpp производит callMe ("price" = "hi"), поэтому я думаю, что определения в порядке! , я знаю о препроцессоре, но я должен сделать это таким образом :(Спасибо за ответ – gchatzip

0

Это должно быть сделано с классами, перегружать различные логические операторы для создания абстрактного синтаксического дерева вместо фактического выполнения операция. Затем вы можете выразить различные выражения SQL как код C++ и получить абстрактное синтаксическое дерево, которое затем может быть сериализовано в предложение SQL WHERE.

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

+0

Вы правы, но мы изначально решили, что это препроцессор, я не могу позволить себе изменить оригинальный дизайн, поэтому я ищу решение проблемы у меня есть, что я не могу преодолеть, Большое спасибо за подсказку, я обязательно попробую ее позже :) – gchatzip

1

Чтобы получить то, что вы хотите, вам нужно будет написать свой код как SET(COLUMN(price)"=hi").

Вы не можете перегрузить operator=() для встроенного типа. Это делается, в частности, для поддержания работоспособности.

Перегрузка C++ не предназначена для принудительного компилятора для разбора другого языка.

P.S. Перегрузка operator=() в классе Table обрабатывает случай, когда 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

Спасибо, что сообщили мне. Есть ли какие-либо подсказки, если я все еще хочу сделать, что «price» = «hi» будет «price = hi», я не могу изменить синтаксис, я не могу думать о чем-то другом :( – gchatzip