Coding_Style - Nagarei/DxLibEx GitHub Wiki

命名規則

ヘッダー名

原則小文字と_のみで、理由がない限り拡張子は.hppにする

#define

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名前空間ないしその下位の名前空間に入れる。大文字と数字と_のみを使用する

型名

小文字を使い、_で区切る

cv-qualifier

Reference

const T& vのように書く。

Pointer

const T* vのように書く。T const * const * constとかなる場合は考えない。(ポインタを使わない)

括弧

if,for,whileの括弧の位置

if (...) {
     ...
}

関数定義時の括弧の位置

これは守れていないことも多い。

void f()
{
  //do something
}
void g(){}

return文

std::move

NRVOを阻害するので基本的には書かない。ただし戻り値がrvalue-referenceの場合を除く。

関数宣言の後ろのconstやnoexcept

	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));
 	}

のようにする

C++のテクニック

SFINAE

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と書けば大丈夫なこともある、謎い。

⚠️ **GitHub.com Fallback** ⚠️