boostより美しい文字連結ができるシステムを思いついた!

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

boostより美しい文字連結ができるシステムを思いついた!

投稿記事 by MoNoQLoREATOR » 13年前

varクラスのqvar()関数を追加した時に気づきました。うわっ これ画期的だ・・・!!

細かい説明は後にすることにして、まずはその文字連結方法をお見せします↓

CODE:

#define _CRT_SECURE_NO_DEPRECATE

#include "connect.h"

int main(){
	int inum = 2525;
	float fnum = 2525;
	double dnum = 2525.2525;

	printf(cnct()

using namespace std;

#ifndef _FTOS_
#define _FTOS_
string ftos(double num){
	char media[33];
	sprintf(media, "%f", num);
	string str = media;
	return str;
}
#endif

#ifndef _ITOS_
#define _ITOS_
string itos(int val, int radix = 10){
	char recep[33];
	string output = _itoa(val, recep, radix);
	return output;
}
#endif

#ifndef _CONNECT_
#define _CONNECT_

class forCNCTclass{
	string mystr;

public:

	string & content(){ return mystr; }

	forCNCTclass & operator<< (int rnum){
		mystr.append(itos(rnum) );
		return *this;
	}
	forCNCTclass & operator<< (double rnum){
		mystr.append(ftos(rnum) );
		return *this;
	}
	forCNCTclass & operator<< (string &str){
		mystr.append(str);
		return *this;
	}
	forCNCTclass & operator<< (const char *str){
		mystr.append(str);
		return *this;
	}
	forCNCTclass & operator<< (forCNCTclass &fcc){
		mystr.append(fcc.content() );
		return *this;
	}

	const char * operator<<= (int rnum){
		mystr.append(itos(rnum) );
		return mystr.c_str();
	}
	const char * operator<<= (double rnum){
		mystr.append(ftos(rnum) );
		return mystr.c_str();
	}
	const char * operator<<= (string &str){
		mystr.append(str);
		return mystr.c_str();
	}
	const char * operator<<= (const char *str){
		mystr.append(str);
		return mystr.c_str();
	}
	const char * operator<<= (forCNCTclass &fcc){
		mystr.append(fcc.content() );
		return mystr.c_str();
	}

	const char * operator< (int rnum){
		mystr.append(itos(rnum) );
		return mystr.c_str();
	}
	const char * operator< (double rnum){
		mystr.append(ftos(rnum) );
		return mystr.c_str();
	}
	const char * operator< (string &str){
		mystr.append(str);
		return mystr.c_str();
	}
	const char * operator< (const char *str){
		mystr.append(str);
		return mystr.c_str();
	}
	const char * operator< (forCNCTclass &fcc){
		mystr.append(fcc.content() );
		return mystr.c_str();
	}
};

forCNCTclass cnct(){
	forCNCTclass fcc;
	return fcc;
}

#endif
[/spoil]

cnct()関数はforCNCTclassオブジェクトを返しているだけです。実は、そこがミソなのです。
printf(forCNCTclass fcc << inum << fnum);
単純に考えると、上記のように書きたい所ですが、これではコンパイルエラーになってしまいます。
しかし、関数から返ってきたオブジェクトであれば全く問題ありません。
これにより、非常に美しい文字連結が可能になりました。


使用方法詳細

cnct()関数を呼べば、後は<<演算子を使ってどんどん文字・数値(int,double,string&,const char*)を連結してゆけます。最後の連結のときだけ<<=演算子又は<演算子(動作は全く同じですのでお好みの方をご使用ください)を使用することでconst char*型が返され、めでたく連結された文字列を渡すことができます。



以上です。
ここまで興奮して書いたのですが、もしかしたらもう既にこのシステムは発見されているかもしれませんねぇ・・・。
最後に編集したユーザー MoNoQLoREATOR on 2011年11月08日(火) 23:40 [ 編集 1 回目 ]

アバター
a5ua
記事: 199
登録日時: 14年前

RE: boostより美しい文字連結ができるシステムを思いついた!

投稿記事 by a5ua » 13年前

MoNoQLoREATOR さんが書きました: ちなみに返値の型が指定されていない上に返値を返していますが、これは「キャストをオーバーロードする場合」に特別に認められていることなのですか?
そうです。キャストのオーバーロードの構文は、

CODE:

operator “型名” ();
であり、“型名”に変換したいわけですから、戻り値の型は当然、“型名”になりますよね。
MoNoQLoREATOR さんが書きました: ところで、以下のソースコードでは不正アクセスは起こりませんよね?

CODE:

string &s = ostringstream().str();
printf(s.c_str() );
VCだと、言語拡張により問題ないと思いますが、
警告レベルを最大にしたり、言語拡張をオフにすれば、警告ないしコンパイルエラーになるはずです。
この場合だと、値で受け取るのが普通だと思います。(const reference や rvalue referenceでもいいですが)

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

Re: boostより美しい文字連結ができるシステムを思いついた!

投稿記事 by MoNoQLoREATOR » 13年前

クラス名()
としたときに生成されるデータのスコープが知りたいです。
そもそもこの構文(?)は、無名のインスタンスを生成しているという解釈で合っているのでしょうか?

アバター
a5ua
記事: 199
登録日時: 14年前

Re: boostより美しい文字連結ができるシステムを思いついた!

投稿記事 by a5ua » 13年前

MoNoQLoREATOR さんが書きました: そもそもこの構文(?)は、無名のインスタンスを生成しているという解釈で合っているのでしょうか?
それで合っています。
MoNoQLoREATOR さんが書きました: クラス名()
としたときに生成されるデータのスコープが知りたいです。
正確には、生成される一時オブジェクトの寿命でしょうか。

C++では、オブジェクトの寿命が尽きるとデストラクタが呼ばれるので、
以下のようなコードで試してみると良いと思います。

一時オブジェクトを生成する式が現れる文が終了すると(;の時点)
そのオブジェクトの寿命が尽きますが、
const reference や rvalue reference (C++11) な変数で一時オブジェクトを束縛すると、
一時オブジェクトの寿命が、参照変数の寿命まで伸びます。

CODE:

#include 

class TempObjTest
{
public:
	TempObjTest(int i) : i(i)
	{
		std::cout << "constructor" << i << std::endl;
	}
	~TempObjTest()
	{
		std::cout << "destructor" << i << std::endl;
	}
private:
	int i;
};

int main()
{
	std::cout << "[test1]" << std::endl;
	// 生成されてすぐ破棄される
	TempObjTest(1);
	
	std::cout << "[test2]" << std::endl;
	// 一時オブジェクトを束縛
	const TempObjTest &temp1 = TempObjTest(2);

	// C++11対応なら
	//std::cout << "[test3]" << std::endl;
	//TempObjTest &&temp2 = TempObjTest(3);

	std::cout << "[test4]" << std::endl;
	// 2よりも先に破棄される
	TempObjTest(4);

	return 0;
}

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

Re: boostより美しい文字連結ができるシステムを思いついた!

投稿記事 by MoNoQLoREATOR » 13年前

ありがとうございます。なるほどそういうことでしたか。
参照ではなくポインタでためしてみたのですが、すぐに消滅しました。
これは参照でのみ実現可能なのですね。なんだかおかしな感じです。