Open9

C++

whiwhi

テンプレート

whiwhi

Type Erasure

基本形


struct base {
  virtual ~base() {}
};

template<class T>
struct derived : public base {
  derived(const T& t) : t_(t) { }
  virtual ~derived() {}
private:
  T t_;
};

class X {
public:
  template<class T>
  X(const T& t) {
    base = new derived<T>(t) 
  }
  ~X() {
    delete p_;
  }
private:
  base* p_;
};
whiwhi

Compressed Pair(EBO)

template<typename A, typename B> 
struct cp : public A {
    B b;
    template<typename... Args>
    cp(Args... args) : A(), b(std::forward<Args>(args)...){}
    A& f() {return *this;}
    B& s(){return b;}
};
int main() {
    cp<std::hash<int>, int> a(10);
    int b = a.f()(a.s()); 
    std::cout << b << std::endl; // 10
    std::cout << sizeof(a) << std::endl; // 4
    std::pair<std::hash<int>, int> p(std::hash<int>(), 10);
    std::cout << sizeof(p) << std::endl; // 8
}
whiwhi

Hidden comment
Hidden comment
Hidden comment
whiwhi

bitfield

構造体のメンバ変数の使用するビット範囲を指定する。コンパイラによってパディングの仕様が異なるので注意

// clang18.0.0
struct S {
    uint32_t a : 16;
    uint32_t b : 8;
    uint32_t c : 7;
    //uint32_t d : 2;
};
int main()
{
    // S s = {0b0000000001111111, 0b00000001, 0b1000000, 0b11};
    S s = {0b0000000001111111, 0b00000001, 0b1000000};
    cout << sizeof(s) << endl; // 4, コメントを取ると8になった
}