Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

今回はDXライブラリstd::coutのような機能を作っていこうと思います。

>> 実装した機能のソースコードはこちらにあります。

DXライブラリにはC++っぽい出力がない

まずはじめに、DXライブラリにはC++っぽく画面へ出力する機能がありません。

C++っぽい出力
std::cout << "Hello World!" << std::endl;

上に書いたコードがC++っぽい出力です。
出力演算子を使っていますね。

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

対してこちらはC言語の出力です。
DXライブラリにはC言語のprintf()に激似の"画面に文字を出力する"関数があります。
それがこちら。

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

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

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

coutDxを作成する

DXライブラリにはprintf()と同等の機能を提供するprintfDx()という関数があります。

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

ソースコード

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()と同様に出力した文字を消去できます。

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

サンプルコード(使い方の例)

ソースコード

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ライブラリでC++っぽい出力が出来るようになりました!

>> 実装した機能のソースコードはこちらにあります。

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

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

These codes are licensed under CC0.
CC0

gis
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away