Coding_Style - Nagarei/DxLibEx GitHub Wiki
原則小文字と_
のみで、理由がない限り拡張子は.hpp
にする
DXLE_
からはじめ、大文字と数字と_
のみを使用する
DXLE_INC_(ルートから見たフォルダー名大文字)_(ファイル名大文字)_H(PP)_
のように。#pragma once
は使わない。
例:./config/config.hpp
だったら
#ifndef DXLE_INC_CONFIG_CONFIG_HPP_
#define DXLE_INC_CONFIG_CONFIG_HPP_
//中略
#endif //DXLE_INC_CONFIG_CONFIG_HPP_
定数はconstexpr
, static const
, enum
, enum class
があるがいずれもdxle
名前空間ないしその下位の名前空間に入れる。大文字と数字と_
のみを使用する
小文字を使い、_
で区切る
const T& v
のように書く。
const T* v
のように書く。T const * const * const
とかなる場合は考えない。(ポインタを使わない)
if (...) {
...
}
これは守れていないことも多い。
void f()
{
//do something
}
void g(){}
NRVOを阻害するので基本的には書かない。ただし戻り値がrvalue-referenceの場合を除く。
DXLE_CONSTEXPR to static_cast_if(from&& n)
DXLE_NOEXCEPT_IF_EXPR((
dxle::detail::static_cast_if_helper<to, from, do_cast>()(
std::move(std::declval<from>()))))
{
return dxle::detail::static_cast_if_helper<from, to, do_cast>()(std::move(n));
}
ではなく
DXLE_CONSTEXPR to static_cast_if(from&& n)
DXLE_NOEXCEPT_IF_EXPR((
dxle::detail::static_cast_if_helper<to, from, do_cast>()(
std::move(std::declval<from>())
)
))
{
return dxle::detail::static_cast_if_helper<from, to, do_cast>()(std::move(n));
}
のようにする
template<typename T, typename std::enable_if<std::is_arithmetic<T>::value, std::nullptr_t>::type = nullptr>
template<typename T, enable_if_t<std::is_arithmetic<T>::value, nullptr_t> = nullptr>
このようにstd::nullptr_t
型を使用する。これはstd::nullptr_t
型はnullptr
以外の値を取らないので、template実引数に直接値を指定されても動作に影響がでないためです。
C++ - std::enable_ifを使ってオーバーロードする時、enablerを使う? - Qiita
http://ask.fm/EzoeRyou/answer/132397333591
ただし、VS2013ではSFINAE回りにバグが多いしかないので注意。特にSFINAEでオーバーロード呼び分けはほぼ確実にバグるので、ヘルパークラスを作りtemplate部分特殊化で対応する。またalias templateで定義されているenable_if_t
だとエラーになりtypename std::enable_if<>::type
と書けば大丈夫なこともある、謎い。