Tips

概要:備忘録

local_unique_ptr

概要:その場凌ぎのスマートポインター
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
void sample()
{
  class local_unique_ptr final // : noncopyable
  {
  public:
    //explicit local_unique_ptr(std::nullptr_t) : p_(nullptr) { throw std::bad_alloc(); }
    explicit local_unique_ptr(char* p) : p_(p){}
    ~local_unique_ptr() { delete[] p_; }
    char* const get() const{ return p_; }
    //explicit operator bool() const { return p_; }
  private:
    local_unique_ptr(const local_unique_ptr&) = delete; //< noncopyable
    local_unique_ptr& operator=(const local_unique_ptr&) = delete; //< noncopyable
    char* const p_;
  } buffer(new char[128]);
  std::strcpy(buffer.get(), "test string");
}

static_assert

概要:C++98(C++11の場合は static_assert を使う)
1
#define STATIC_ASSERT(e) typedef char STATIC_ASSERT_[(e) ? 1 : -1]

配列補助

テンプレート

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
/// @brief 静的配列の要素数
template<class TType, std::size_t N_> inline
constexpr std::size_t array_lengthof(TType (&)[N_])
{
     return N_;
}

/// @brief 静的配列の最後の要素(std::end())
template<class TType, std::size_t N_> inline
constexpr TType* array_endof(TType (&V_)[N_])
{
     return V_ + N_;
}

マクロ

1
2
3
4
/// @brief 静的配列の要素数
#define ARRAY_LENGTHOF(array) (sizeof(array)/sizeof(array[0]))
/// @brief 静的配列の最後の要素(std::end())
#define ARRAY_ENDOF(array) (array + (sizeof(array)/sizeof(array[0])))

インクルード

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
// noncopyable.hpp
#pragma once

namespace poor {
#ifndef __cplusplus
#    error C++ compiler required.
#endif
#if (__cplusplus => 201103L) //< C++11 or Later
#    include "core/cpp11/noncopyable.hpp"
#elif (__cplusplus => 199711L) || (__cplusplus == 1) //< C++98
#    include "core/cpp98/noncopyable.hpp"
#else // (__cplusplus == 0)
#    error __cplusplus value.
#endif
} //< namespace poor