C++中无法修改原wrapper结构体时,能否为typedef定义的类型扩展成员函数语法?
问题结论
直接实现你要求的v.size()成员调用语法是不可能的,C++标准不支持在不修改类定义的前提下为已有的类新增成员函数,你没有wrapper结构体的修改权限的前提下,无法直接为它添加size成员。
可行替代方案
方案1:公有继承wrapper扩展功能
这是改造成本最低的方案,只需要新增自定义的扩展类,替换原来的vecint别名定义即可:
#include <vector> // 假定这部分是你无法修改的原有定义 template<typename T> struct wrapper {}; // 新增扩展实现 template<typename T> struct extended_wrapper : public wrapper<T> { // 继承父类的所有构造函数 using wrapper<T>::wrapper; // 新增size成员函数,内部调用你已有的非成员size实现 size_t size() const { return size(*this); } }; // 替换原来的vecint别名定义 using vecint = extended_wrapper<std::vector<int>>;
注意事项
- 如果你不会通过
wrapper<T>指针/引用来销毁extended_wrapper实例,即使wrapper没有虚析构函数也不会有问题,常规值语义使用完全安全 - 原有对
wrapper类型生效的所有函数、操作符都可以直接作用在extended_wrapper实例上,不需要额外适配
方案2:实现适配器包装类
如果wrapper被声明为final无法继承,可以用组合的方式实现适配器:
template<typename T> struct wrapper_adapter { wrapper<T> inner; // 转发构造函数 template<typename... Args> wrapper_adapter(Args&&... args) : inner(std::forward<Args>(args)) {} // 实现size成员 size_t size() const { return size(inner); } // 如果需要调用其他针对wrapper的函数,可以隐式转换为wrapper<T>的引用 operator wrapper<T>&() { return inner; } operator const wrapper<T>&() const { return inner; } }; using vecint = wrapper_adapter<std::vector<int>>;
补充说明
截至C23标准,C都没有引入统一函数调用语法(UFCS),无法让非成员函数直接支持对象.函数名()的调用方式,所以除了上面两种修改类型定义的方案外,没有其他实现路径。
内容的提问来源于stack exchange,提问作者tommsch
相关产品推荐
相关产品推荐

