覚書。
1. memsetはint以外でも使える?
ゼロ初期化目的であればOKな型:
int, float, double, bool, char, short, long, unsigned 系
いわゆる「POD(Plain Old Data)」型ならOK ❌ NGや危険:
ポインタ(アーキテクチャ依存でNULLポインタが非0バイトになる場合あり)
オブジェクト型(コンストラクタ・デストラクタを持つ)
memsetでゼロ埋めしたいなら、「すべてのビットが0で意味がある」型だけにするのが安全。
2. std::is_same で memset分岐する方法?
if constexpr (std::is_same<T, int>::value || std::is_same<T, double>::value || ...) {
std::memset(...); // OK
} else {
// 何もしない or static_assert でコンパイルエラー
}
テンプレート制約ならこう:
static_assert(
std::is_same<T, int>::value || std::is_same<T, float>::value || ...,
"T must be a POD type suitable for memset");
3. コンパイルエラーを強制する方法
static_assert(std::is_same<T, int>::value || std::is_same<T, double>::value,
"This array class supports only primitive types");
これでオブジェクト型や構造体を使うと即ビルドエラーにできます。
4. memsetゼロ初期化OKなプリミティブ型一覧
int, unsigned int
short, unsigned short
long, unsigned long
long long, unsigned long long
float, double, long double
bool
char, unsigned char, wchar_t, char16_t, char32_t
std::byte(C++17~) 共通点:全ビットが 0 のとき「意味を持つ」型
引用 ChatGPT