イネマルのプログラミング備忘録

趣味プログラマーのメモ

C++でC#風な基本型を使う

f:id:inemaru:20160619195641p:plain

C#風に基本型が使えたら楽だと思う

int.ToString()みたいにかけるC#にあこがれて
勢いでC++の基本型をラップしてみた感じ。

目的

基本型を、C#ライクに記述できるようにする。

注意

実用性は考慮していません。
完全に興味本位で書いたので、実装に穴があるかもしれません。
特に問題なのは、速度面でコンストラクタ呼び出しの分非常に低速
(POD形式にすれば速度面は対応可能だけど目的が達成不可)

確認用のプログラム

ExtensionPrimitiveTypeは長すぎるのでGitHubに保存  ExtensionPrimitiveType.hpp
※動作確認は、VC2013

#include <iostream>
#include "ExtensionPrimitiveType.hpp"

int main()
{
	using namespace std;
	using namespace IneFramework;

	// pt_(型名)でいろいろ定義
	// ExtensionPrimitiveType<(型名)>でtypedefしてある
	pt_int iValue = 100;

	cout << "int型として使用可能:\n\t";
	cout << iValue << "\n\n";	// cout << でint型のオーバーロードが呼ばれる

	cout << "string型に変換:\n\t";
	cout << iValue.ToStringA() << "\n\n";

	cout << "文字列から数値を取得:\n\t";
	cout << pt_int::Parse("123") << "\n\n";

	cout << "型の名前:\n\t";
	cout << iValue.GetTypeInfo().name() << "\n\n";
	cout << "型の有効範囲(上限):\n\t";
	cout << iValue.GetTypeLimitInfo().max() << "\n\n";

	cout << "ハッシュ値:\n\t";
	cout << iValue.GetHash() << "\n\n";

	cout << "型推論で期待する型で計算:\n\t";
	auto autoValue = iValue + 0.5;
	cout << autoValue << "\n\t";
	cout << autoValue.GetTypeInfo().name() << "\n\n";

	rewind(stdin), getchar();
	return 0;
}

あとがき

実装に関してだいぶ無知なので手探り状態だけど
品質向上のタイミングがあればもう少し綺麗に書き直したいと思う。
むしろ、こういった類のものが既出してないのか気になる・・・。