문제

다음과 같은 템플릿 클래스가 있습니다.

template<T>
class MyClass
{
  T* data;
}

때로는 다음과 같이 일정한 유형 T가있는 클래스를 사용하고 싶습니다.

MyClass<const MyObject> mci;

그러나 사용 데이터를 수정하고 싶습니다 const_cast<MyObject*>data (그 이유는 중요하지 않습니다 MyClass 데이터 자체의 참조 수를 유지하는 참조 수 스마트 포인터 클래스입니다. MyObject 카운트가 포함 된 일부 유형에서 파생됩니다. 데이터를 수정해서는 안되지만 카운트는 스마트 포인터에 의해 수정되어야합니다.).

Const-sness를 제거하는 방법이 있습니까? T? 허구 코드 :

const_cast<unconst T>(data) 

?

도움이 되었습니까?

해결책

여기서 가장 간단한 방법은 기준 수를 변동성있게 만드는 것입니다.

그러나 그것이 어떻게 작동하는지에 관심이 있다면 const_cast, 그런 다음 부스트를 상환합니다 remove_const 매우 간단해야합니다.

template <class T>
struct RemoveConst
{
    typedef T type;
};

template <class T>
struct RemoveConst<const T>
{
    typedef T type;
};

const_cast<typename RemoveConst<T>::type*>(t)->inc();

다른 팁

당신은 대답이 있습니다. const_cast는 양방향으로 작동합니다.

char* a;
const char* b;

a = const_cast<char*>(b);
b = const_cast<const char*>(a); // not strictly necessarily, just here for illustration

특정 문제에 관해서는 변이 가능한 키워드를 고려 했습니까? Const 메소드 내에서 멤버 변수를 수정할 수 있습니다.

class foo {
    mutable int x;
public:
    inc_when_const() const { ++x; }
    dec_when_const() const { --x; }
};

침입 포인터가 관리하는 클래스에서 참조 수를 변형시킵니다. 이것은 전적으로 합리적이며 "논리적 콘트 스네스"를 정확하게 반영합니다. 즉, 객체의 참조 수를 변경하는 것은 객체 자체의 상태의 변화를 반영하지 않습니다. 다시 말해, 참조 수는 논리적으로 객체의 일부가 아닙니다. 객체는이 반 관련 데이터를 저장하기에 편리한 장소입니다.

Boost를 사용할 수있는 경우 Library 유형이 제공합니다. 제거 _const 그렇게하는 MetaFunction.

여기 내 C ++ 11이 있습니다 unconst 기능 template.

당신이 그것을 사용한다면, 당신은 유혹하고 있습니다 정의되지 않은 행동. 당신은 그랬습니다 경고.

// on Ubuntu (and probably others) compile and test with                                                        
//   g++ -std=c++11 test.c  &&  ./a.out  ;  echo $?                             

template < class T >  T &  unconst  ( T const & t ) {
  return  const_cast < T & >  ( t ) ; 
}

// demonstration of use

struct {
  const int n = 4;
} s;

int main () {
  unconst ( s.n ) = 5;
  return s.n;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top