'const'& 'const가 아닌'객체에서 액세스 할 수있는 멤버 함수를 정의하는 방법이 있습니까?'const'와 'non-const'객체 모두에서 인스턴스화 할 수있는 유니버설 멤버 함수 정의
내 sList
목록 클래스 구현에 필요합니다. 그것에서 나는 매개 변수로 다른 함수를 'const'또는 'non-const'포인터를 sList
으로 취하고 현재 sList
구조의 각 목록에 대해 호출 할 함수를 선언하려고합니다. 나는 결국 너무 람다 전달하려는 때문에 내가 auto pFunc
을 사용하고
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;
};
:
여기에 선언합니다. 그래서 지금 내가이 타입의 const 객체를 가지고 있고 그것으로부터 'DoForEachList'를 호출하면 'auto'타입으로부터 1 arg를 가진 인자 λ 함수로 전달됩니다. 코드가 DoForEachList
를 호출
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]
그리고 : 제 컴파일러는 같은 실패합니다
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);
}
//...
};
friend 함수 템플릿과 어쩌면 두 개의 멤버 함수 래퍼를 사용할 수 있습니다. – dyp
아주 간단합니다. - const가 아닌 객체는 언제나 'const' 참조에 바인딩 할 수 있지만 다른 방법으로는 사용할 수 없습니다. 그것은 암시 적 변환 (한정 변환)입니다. 흠. 그것은 당신이 실제로 const가 아닌 객체에서 호출 할 때 객체를 수정하고 싶다면 쓸모가 없습니다. 이 경우 두 개의 함수를 작성하십시오. – Deduplicator
같은 몸으로 - 아,이게 최선의 방법인가요? 래퍼 함수를 사용하는 것은 해결책이 아닙니다. 왜냐하면 'pFunc'인수가 잘못 추론 될 것이기 때문입니다 ('this'에 const_cast를 사용하여 'const'멤버 함수에서 'non-const'호출을 감싸면 람다 함수 arg가 ' sList * '잘못되었습니다). – AnArrayOfFunctions