DxLibでstd::cout出力を実装する【printf()からの解放】

#はじめに
今回は[DXライブラリ](http://dxlib.o.oo7.jp/)で`std::cout`のような機能を作っていこうと思います。

[>> 実装した機能のソースコードはこちらにあります。](https://github.com/Kasugaccho/coutDx)

#[DXライブラリ](http://dxlib.o.oo7.jp/)にはC++っぽい出力がない
まずはじめに、[DXライブラリ](http://dxlib.o.oo7.jp/)にはC++っぽく画面へ出力する機能がありません。

```cpp:C++っぽい出力
std::cout << "Hello World!" << std::endl;
```
上に書いたコードがC++っぽい出力です。
出力演算子を使っていますね。

```cpp:C言語っぽい出力
printf("%s\n", "Hello World!");
```

対してこちらはC言語の出力です。
[DXライブラリ](http://dxlib.o.oo7.jp/)にはC言語の`printf()`に激似の"画面に文字を出力する"関数があります。
それがこちら。

```cpp:DXライブラリのC言語っぽい出力
printfDx("%s\n", "Hello World!");
```

`printfDx()`という関数です。
画面に文字を出力するという点では、ほぼ`printf()`と変わりません。

ちなみに`printfDx()`で出力した文字を消去する際は`clsDx()`という関数を使います。

#[coutDx](https://github.com/Kasugaccho/coutDx)を作成する

[DXライブラリ](http://dxlib.o.oo7.jp/)には`printf()`と同等の機能を提供する`printfDx()`という関数があります。

ならば、`std::cout`と同等の機能を提供する`coutDx`を作ろうではありませんか。


#[ソースコード](https://github.com/Kasugaccho/coutDx/blob/master/dx_cout/coutDx.hpp)

```cpp:coutDx.hpp
	struct EndlDx {
		EndlDx() = default;
		~EndlDx() = default;
	};
	constexpr EndlDx endlDx;

	struct ClearDx {
		ClearDx() = default;
		~ClearDx() = default;
	};
	constexpr ClearDx clearDx;

	class CoutDx {
	public:

		const CoutDx& operator<<(const char var_) const {
			printfDx("%c", var_);
			return *this;
		}
		const CoutDx& operator<<(const signed char var_) const {
			printfDx("%c", (char)var_);
			return *this;
		}
		const CoutDx& operator<<(const unsigned char var_) const {
			printfDx("%c", (char)var_);
			return *this;
		}
		const CoutDx& operator<<(const short var_) const {
			printfDx("%d", var_);
			return *this;
		}
		const CoutDx& operator<<(const unsigned short var_) const {
			printfDx("%u", var_);
			return *this;
		}
		const CoutDx& operator<<(const int var_) const {
			printfDx("%d", var_);
			return *this;
		}
		const CoutDx& operator<<(const unsigned int var_) const {
			printfDx("%u", var_);
			return *this;
		}
		const CoutDx& operator<<(const long var_) const {
			printfDx("%ld", var_);
			return *this;
		}
		const CoutDx& operator<<(const unsigned long var_) const {
			printfDx("%lu", var_);
			return *this;
		}
		const CoutDx& operator<<(const long long var_) const {
			printfDx("%lld", var_);
			return *this;
		}
		const CoutDx& operator<<(const unsigned long long var_) const {
			printfDx("%llu", var_);
			return *this;
		}

		const CoutDx& operator<<(const float var_) const {
			printfDx("%f", var_);
			return *this;
		}
		const CoutDx& operator<<(const double var_) const {
			printfDx("%f", var_);
			return *this;
		}
		const CoutDx& operator<<(const long double var_) const {
			printfDx("%lf", var_);
			return *this;
		}

		const CoutDx& operator<<(const char* const var_) const {
			printfDx("%s", var_);
			return *this;
		}
		const CoutDx& operator<<(const std::string& var_) const {
			printfDx("%s", var_.c_str());
			return *this;
		}

		const CoutDx& operator<<(const EndlDx& var_) const {
			printfDx("\n");
			return *this;
		}
		const CoutDx& operator<<(const ClearDx& var_) const {
			clsDx();
			return *this;
		}
		const CoutDx& endl() const {
			printfDx("\n");
			return *this;
		}
		const CoutDx& clear() const {
			clsDx();
			return *this;
		}
	};
	constexpr CoutDx coutDx;
```

#説明と使い方
ツクれました。
`ここが変だよ！` `こう書いたほうがいいんじゃない？`といった意見、大歓迎です。~~と言うか欲しいです。~~

`coutDx << 変数;`で簡単に文字が出力できます。

おまけ (と言うか便利機能)で`std::endl`に似たような機能を持つ
`endlDx`が使えます。(といっても`endlDx`は改行の機能しかないけど……)

あと、`clearDx`という機能で`clsDx()`と同様に出力した文字を消去できます。

書式フラグ (書式のマニピュレータ)の機能は ~~実装が面倒なため~~ ありません。

#[サンプルコード(使い方の例)](https://github.com/Kasugaccho/coutDx/blob/master/dx_cout/Source.cpp)

###[ソースコード](https://github.com/Kasugaccho/coutDx/blob/master/dx_cout/Source.cpp)
```cpp:Source.cpp
#include "DxLib.h"
#include "coutDx.hpp"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	ChangeWindowMode(TRUE);
	if (DxLib_Init() == -1) return -1;

	const char char_ = 'a';
	const unsigned char uchar_ = 'a';
	const signed char schar_ = 'a';
	const unsigned short ushort_ = 1;
	const short short_ = -1;
	const unsigned int uint_ = 1;
	const int int_ = -1;
	const unsigned long ulong_ = 1;
	const long long_ = -1;
	const unsigned long long ulonglong_ = 1;
	const long long longlong_ = -1;
	const float float_ = 1.0f;
	const double double_ = 1.0;
	const long double longdouble_ = 1.0;
	const char* const char_ptr_ = "Hello World!";
	const std::string string_ = "Hello World!";

	coutDx << char_ << endlDx;
	coutDx << uchar_ << endlDx;
	coutDx << schar_ << endlDx;
	coutDx << ushort_ << endlDx;
	coutDx << short_ << endlDx;
	coutDx << uint_ << endlDx;
	coutDx << int_ << endlDx;
	coutDx << ulong_ << endlDx;
	coutDx << long_ << endlDx;
	coutDx << ulonglong_ << endlDx;
	coutDx << longlong_ << endlDx;
	coutDx << float_ << endlDx;
	coutDx << double_ << endlDx;
	coutDx << longdouble_ << endlDx;
	coutDx << char_ptr_ << endlDx;
	coutDx << string_ << endlDx;

	WaitKey();
	DxLib_End();
	return 0;
}
```

###出力結果
```:画面にこんな風に出力されます。
a
a
a
1
-1
1
-1
1
-1
1
-1
1
1
1
Hello World!
Hello World!
```

#ハッピーエンド

###これで[DXライブラリ](http://dxlib.o.oo7.jp/)でC++っぽい出力が出来るようになりました！
###[>> 実装した機能のソースコードはこちらにあります。](https://github.com/Kasugaccho/coutDx)

今回はこれで終わります。
不備がありましたらコメントにてお伝えください。

##ソースコードのライセンス

These codes are licensed under CC0.
[![CC0](https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/cc-zero.svg "CC0")](http://creativecommons.org/publicdomain/zero/1.0/deed.ja)