#はじめに
今回はDXライブラリでstd::cout
のような機能を作っていこうと思います。
#DXライブラリにはC++っぽい出力がない
まずはじめに、DXライブラリにはC++っぽく画面へ出力する機能がありません。
std::cout << "Hello World!" << std::endl;
上に書いたコードがC++っぽい出力です。
出力演算子を使っていますね。
printf("%s\n", "Hello World!");
対してこちらはC言語の出力です。
DXライブラリにはC言語のprintf()
に激似の"画面に文字を出力する"関数があります。
それがこちら。
printfDx("%s\n", "Hello World!");
printfDx()
という関数です。
画面に文字を出力するという点では、ほぼprintf()
と変わりません。
ちなみにprintfDx()
で出力した文字を消去する際はclsDx()
という関数を使います。
#coutDxを作成する
DXライブラリにはprintf()
と同等の機能を提供するprintfDx()
という関数があります。
ならば、std::cout
と同等の機能を提供するcoutDx
を作ろうではありませんか。
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()
と同様に出力した文字を消去できます。
書式フラグ (書式のマニピュレータ)の機能は 実装が面倒なため ありません。
###ソースコード
#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ライブラリでC++っぽい出力が出来るようになりました!
###>> 実装した機能のソースコードはこちらにあります。
今回はこれで終わります。
不備がありましたらコメントにてお伝えください。
##ソースコードのライセンス