有没有一种方法来定义可以从'const'&'非const'对象访问的成员函数?通用成员函数定义,可从'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个参数。我的编译器将失败的东西,如:
error: passing
const sList<unsigned char>
asthis
argument ofvoid sList<T>::DoForEachList(auto:1)
[withauto:1
=main()::<lambda(sList<unsigned char>*)>
;T
=unsigned char
]' discards qualifiers [-fpermissive]
和代码调用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 2014-11-22 22:04:27
非常简单 - 一个非const对象总是可以绑定到一个'const'引用,但不是相反。这是一个隐式转换(合格转换)。嗯。如果你真的想修改对象,但是如果你在一个非const对象上调用它,那就没用了。在这种情况下,只需编写两个函数。 – Deduplicator 2014-11-22 22:06:15
身体一样 - 呃,这是最好的方法吗?使用包装函数不是一个解决方案,因为那么'pFunc'参数会被错误地推导出来(如果我们在'const'成员函数中使用const_cast'this'包装'非const'调用,那么lambda函数arg将被推断为' sList *'这是错误的)。 – AnArrayOfFunctions 2014-11-22 22:26:31