重复、常量和非常量、getter 的宏解决方案?

Posted

技术标签:

【中文标题】重复、常量和非常量、getter 的宏解决方案?【英文标题】:macro solution for duplicate, const and non-const, getters? 【发布时间】:2011-08-10 21:04:04 【问题描述】:

可以将this solution 转换为宏,以便我调用类似以下内容的内容:

CALL_CONST_FUNC(objToReturn, thisPtr)->SomeConstFunc();

对于返回值的函数和不返回值的函数。我的宏观令牌技能不是那么好,所以我想也许这里有人可以想出一个(或者告诉我这是不可能的)。最终的目标是避免编写难看的单行代码,并用易于理解且不易出错的内容替换它。

【问题讨论】:

这看起来不漂亮吗?无论如何,您需要多少个 const 重载? 我宁愿让编写大量 getter 和 setter 变得更难。 @UncleBens:真的吗?它可能不漂亮,但绝对比另一个问题的解决方案中的漂亮 【参考方案1】:

如果一个函数不返回值(引用或指针),你首先需要 const 重载吗?似乎拥有两个的唯一原因是从类中获取 const 或非 const 引用。否则,仅 const 版本就足够了。

至于让习语更甜,不如换几个模板帮手帮你做类型推导:

template <class T>
const T& add_const(T& t)  return t; 

template <class T>
T& remove_const(const T& t)  return const_cast<T&>(t); 

class Foo

    int foo;
public:
    const int& get() const
    
        //non-trivial work
        return foo;
    

    int& get()
    
        return remove_const(add_const(*this).get());
    
;

类型名称越长,好处越大。

【讨论】:

If a function doesn't return a value (reference or pointer), do you need const overloads in the first place? 好点! ...我喜欢这个解决方案 (+1) 如果你的函数的 const 版本返回的东西应该是写保护的,你会通过拉这个技巧不小心使返回的东西写访问。

以上是关于重复、常量和非常量、getter 的宏解决方案?的主要内容,如果未能解决你的问题,请参考以下文章

C语言学习笔记--C语言中的宏定义

C语言如何实现两个非常量的CHAR字符串连接

10深入理解C指针之---指针和常量

顶层const和底层const

常量到非常量 c++

为啥常量整数指针指向允许的非常量整数?