ライブラリアップデート中

アバター
いわん
記事: 30
登録日時: 8年前

ライブラリアップデート中

投稿記事 by いわん » 9ヶ月前

「明日できることは今日しない」
誰の言葉か知らないですが、名言ですな。
「昨日やらなかったことは今日もたぶんやらない」
これは私の言、アフターフォローもばっちり(笑)

新しいC++の機能を勉強しつつ自作ライブラリを更新していますが、なかなか進みません(-_-;)
スクリプト言語処理のポインタを shared_ptr に置き換える改造をしていて
メモリを開放しないデリーターを使えば外部変数(アプリのデータ)を扱うのに
特に意識しないで内部データと同じに扱える事を発見。思わぬ収穫です(^▽^)/

CODE:

#include <iostream>

template <typename T>
class ivalue
{
	std::shared_ptr<T> ptr;	// データのポインタ
public:
	// コンストラクタ データを生成する
	ivalue() : ptr(std::shared_ptr<T>(new T)) {}
	ivalue(T v) : ptr(std::shared_ptr<T>(new T(v))) {}
	// 外部変数のポインタが指定された場合はデリーターに何もしない関数を渡す
	ivalue(T* p) : ptr(std::shared_ptr<T>(p, [](T*) {})) {}

	// 代入演算子はポインタではなくデータを更新する
	ivalue<T>& operator=(const ivalue<T>& r) { *ptr = *r.ptr; return *this; }

	// データ参照の為のキャスト演算子
	operator T() const { return *ptr; }
};

int main()
{
	int ext;
	{
		ivalue<int> a(7), b(8), x(&ext);	// x は外部変数の ext を参照する
		x = a + b;
	}
	std::cout << ext << std::endl;
}

アバター
いわん
記事: 30
登録日時: 8年前

Re: ライブラリアップデート中

投稿記事 by いわん » 8ヶ月前

型推論は便利ですね。
私のスクリプト言語処理では異なる型での演算結果はオペランドの型をいちいち判定して結果の型を
決めていました。新しく追加された decltype を使えば式から型を取得できるので型判定は一切必要
なくなります。これでソースコードがかなりスリムになりました(^^)/

CODE:

#include <iostream>

template <typename T>
class ivalue
{
	std::shared_ptr<T> ptr;	// データのポインタ
public:
	// コンストラクタ データを生成する
	ivalue() : ptr(std::shared_ptr<T>(new T)) {}
	ivalue(T v) : ptr(std::shared_ptr<T>(new T(v))) {}
	// 外部変数のポインタが指定された場合はデリーターに何もしない関数を渡す
	ivalue(T* p) : ptr(std::shared_ptr<T>(p, [](T*) {})) {}

	// 代入演算子はポインタではなくデータを更新する
	ivalue<T>& operator=(const ivalue<T>& r) { *ptr = *r.ptr; return *this; }

	// データ参照の為のキャスト演算子
	operator T() const { return *ptr; }
};

int main()
{
	ivalue<int> a(7);
	ivalue<float> b(8.5);
	ivalue<decltype(a + b)> x(a + b);	// 演算結果の型でオブジェクトを生成
	std::cout << typeid(x).name() << " " << x << std::endl;
}
実行結果
class ivalue<float> 15.5

アバター
いわん
記事: 30
登録日時: 8年前

Re: ライブラリアップデート中

投稿記事 by いわん » 8ヶ月前

型推論で演算結果の型を求められるようになったのはよいですが、複数の派生型を基底クラスのポインタで操作する場合、派生型へのポインタをどうやって得るかで悩んでいます(´-ω-`)
auto derived = down_end_cast(base);
みたいなことが出来れば良いんですが・・・