通用成员函数定义,可从 'const' 和 'non-const' 对象实例化
Universal member-function definition, instanceable from both 'const' & 'non-const' objects
有没有办法定义一个既可以从"const"和"non-const"对象访问的成员函数?
我需要这个来sList
列表类的实现。在其中,我想声明一个函数,该函数将另一个具有"const"或"non-const"sList
指针的函数作为参数,并将为当前sList
结构中的每个列表调用它。
以下是它的声明:
template <typename T>
struct sList
{
sList(initializer_list<T>);
inline void DoForEachList(auto pFunc)
{
for(auto p = this; p; p = p->pNext)
pFunc(p);
}
~sList();
T dat;
sList *pNext = nullptr;
};
我正在使用auto pFunc
因为我也想最终传递 lambda。所以现在如果我有一个这种类型的 const 对象并从它调用"DoForEachList"作为参数 lambda 函数传递,从类型"auto"中传递 1 个参数。我的编译器将失败,如下所示:
错误:将
const sList<unsigned char>
作为void sList<T>::DoForEachList(auto:1)
的参数传递this
[auto:1
=main()::<lambda(sList<unsigned char>*)>
;T
=unsigned char
]' 丢弃限定符 [-允许]
调用DoForEachList
的代码
void main()
{
extern const sList<unsigned char> cvobj;
cvobj.DoForEachList([] (auto pCurr) {/* Do something */});
}
有没有办法像这样定义DoForEachList
成员函数(或成员函数的模板):
template <typename T>
struct sList
{
inline void DoForEachList(auto pFunc) auto //either 'const' or none
{
for(auto p = this; p; p = pNext->pNext)
pFunc(p);
}
//...
};
要在评论中@dyp答案的基础上再接再厉:
如果您想重载this
的恒定性,您确实需要两个单独的函数。但是,您可以通过将工作卸载到帮助程序函数来最大程度地减少重复。
@dyp建议为此使用友元函数模板,但友元函数没有访问控制,所以我通常更喜欢静态成员函数;然后你可以把它设为私有或受保护:
template <typename T>
struct sList
{
void DoForEachList(auto pFunc)
{
DoForEachListHelper(*this, pFunc);
}
void DoForEachList(auto pFunc) const
{
DoForEachListHelper(*this, pFunc);
}
private:
static void DoForEachListHelper(auto&& self, auto pFunc)
{
for(auto p = &self; p; p = pNext->pNext)
pFunc(p);
}
};
你应该只使用 const
成员函数并使成员变量mutable
,它告诉编译器/你成员不会影响类的"已更改"行为。如果不是这种情况,请重新考虑您的设计,因为这不太正确。 mutable
更正确的地方,例如地图的键需要修改,使其不会影响该地图中的顺序,但即便如此......
代码示例:
struct Bla
{
void increment() const { i++; }
private:
mutable int i = 0;
};
int main()
{
const Bla bla;
bla.increment();
}
现场演示在这里。
- C++/SDL "initial value of reference to a non-const must be an lvalue"
- non-const find() in std::unordered_set
- const vs non-const变量一旦分配就没有变化
- 如何修复"initial value of reference to non-const must be an lvalue?"
- 使用 non-const 构造 const 对象
- 在C 17中,为什么关联容器具有``擦除''成员函数,该函数会采用(non-`const`)``iTerator'
- 为什么 boost::interprocess::managed_shared_ptr 到 non-const 不能转换
- "invalid initialization of non-const reference of type..." 克隆() 函数错误
- 为什么无法使用复制构造函数实例化"non const"而可以在没有复制构造函数的情况下实例化配对?
- 如何在没有重复代码的情况下实现"const"和"non-const"重载?
- 为什么在设置类成员时会自动从 const 转换为 non-const 并发生?
- C++ "invalid initialization of non-const reference"错误
- 通用成员函数定义,可从 'const' 和 'non-const' 对象实例化
- 如何用const/non模拟重载函数
- C++:"invalid initialization of non-const reference of type ‘List&’ from a temporary of type ‘List*’"
- 如何使用<double>boost::p ython通过引用将non-const std::vector传递给Python?
- 为什么要编译?期待"cannot assign a constant to a non-const reference"
- 在pass-by-const-reference方法内部的c++ pass-by-non-const-reference
- 使用模板时出现奇怪的"invalid initialization of non-const reference"
- 用于禁用"temporary to non-const reference"错误的 G++ 标志