代码之家  ›  专栏  ›  技术社区  ›  danatel

模板中的const_cast。是否有未约束的修饰符?

  •  9
  • danatel  · 技术社区  · 16 年前

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

    MyClass<const MyObject> mci;
    

    const_cast<MyObject*>data MyClass MyObject

    T ?虚构代码:

    const_cast<unconst T>(data) 
    

    ?

    5 回复  |  直到 16 年前
        1
  •  12
  •   UncleBens    16 年前

    这里最简单的方法是使引用计数可变。

    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();
    
        2
  •  5
  •   jmucchiello    16 年前

    你有答案。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
    

    class foo {
        mutable int x;
    public:
        inc_when_const() const { ++x; }
        dec_when_const() const { --x; }
    };
    
        3
  •  4
  •   Jerry Coffin    16 年前

    在由侵入式指针管理的类中,使引用计数可变。这是完全合理的,并且准确地反映了“逻辑一致性”,即改变对象的引用计数并不反映对象本身状态的任何变化。换句话说,引用计数在逻辑上不是对象的一部分——对象恰好是存储这些半无关数据的方便地方。

        4
  •  3
  •   Bojan Resnik    16 年前
        5
  •  0
  •   mpb    8 年前

    unconst template .

    如果你使用它,你是在调情 undefined behavior .

    // 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;
    }
    
    推荐文章