首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++预处理器和重载问题

C++预处理器和重载问题
EN

Stack Overflow用户
提问于 2011-02-08 04:53:24
回答 4查看 397关注 0票数 0

我有以下问题:

让我们考虑一下我们有

代码语言:javascript
复制
#define SET callMe
#define COLUMN(x) #x

在我们程序的主要代码块中,我们有以下代码行:SET(COLUMN(price)="hi");,在预处理器运行后,它被转换为:

代码语言:javascript
复制
#callMe("price"="hi"); 

我需要函数callMe签名为callMe(string str),这样我们就不得不制作一些东西来将"price"="hi"转换为"price=hi",并让callMe函数来处理其余的问题。最后要说明的是,我描述的所有程序都是Table类的一部分。

我唯一的选择是重载操作符=,以便将"price"="hi"转换为所需的操作符,但我无法获得应该重载的内容,因为我首先想到的是执行以下重载

#std::string operator=(std::string str)作为Table类的成员函数,但我似乎不能让它走上正轨。

有什么线索能让我实现想要的操作吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-02-08 05:18:58

这对你有好处吗?

代码语言:javascript
复制
#define SECOND_PASS(x) callMe(#x)
#define COLUMN(x) x
#define SET(x) SECOND_PASS(x)

这会导致:

代码语言:javascript
复制
callMe("price=\"hi\"");

这实际上是让预处理器在转换为字符串之前删除列。

票数 3
EN

Stack Overflow用户

发布于 2011-02-08 05:12:58

为了得到你想要的东西,你必须把你的代码写成SET(COLUMN(price)"=hi")

不能为内置类型重载operator=()。这样做是为了维护理智,以及其他原因。

C++重载并不允许您强制编译器分析不同的语言。

附注:在Table类中重载operator=()仅处理Table位于=左侧的情况。这将要求COLUMN(x)返回一个Table对象,这可能不是您想要的。您可以使用adaptor类来实现此效果,但是COLUMN(x)的语法不包括此列来自哪个表,因此您也陷入了困境。

一种解决方案是这样的:

代码语言:javascript
复制
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);

根据您拥有的任何编码标准重新格式化和反内联。

票数 1
EN

Stack Overflow用户

发布于 2011-02-08 04:59:52

你是说就像

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

ps -关于使用预处理器的常见免责声明

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4926435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档