トップページ⇒tech
95コメント38KB

おもろいC++コードを貼るスレ

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
みんなで技巧的なコードを考えてくれ!
template<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);
}
};
0045デフォルトの名無しさん2005/10/28(金) 14:07:41
>>44
キャストのショックでそこまで見てなかったがそういえば正常終了じゃ困るな。

でも今日このコードのことを直接聞いてみたら
「試しに書いてみただけで使ってない。」
と聞いてちょっとホっとしながらコメントアウトした俺。
0046デフォルトの名無しさん2005/10/28(金) 16:19:19
つーか、C++でexit()ってのが有り得ないだろ。
0047デフォルトの名無しさん2005/10/28(金) 16:41:40
実験中のコードだったんじゃないの。
0048デフォルトの名無しさん2005/10/28(金) 17:01:22
実験コードがαとはいえリリース用の移植作業までそのまま残って
回ってくるというのも若干アレだが、
そもそもリストの中身のポインタをキャストするのに
リストごとキャストしようとしたり
static_castをひねくりまわしてオブジェクトへのポインタの変換可能性を
チェックしようとしたりするあたりのことは
コードで実際に実験する前に止めておいてほしい気もする。
0049402005/10/31(月) 11:35:44
typedef map<K,vector<void*> > KMap;
//これが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!!!!!!!!!!
//テンプレート使ってる意味もクラス使ってる意味もねぇぇぇぇ!!
0050402005/10/31(月) 11:40:21
このクラスは実験用コードじゃなくてマジ使われていた筈、
正直ロジックに深く噛んでいるから移植担当の漏れの小手先では直せない。
となるとこのヤヴァさを英語で諭して直してもらわないとイカンのか・・・。
正直・・・     ○| ̄|_
0051402005/10/31(月) 11:42:44
>>49
訂正:class E::kmapはKMapじゃなくてKMap&な。
0052452005/11/02(水) 15:30:33
>>45の「試しに書いてみただけで使ってない。」
は大嘘であったことが判明。よく調べたら思い切り実地で使われていた…。
0053402005/11/07(月) 16:01:33
//せめてもう少しマシに型検査できるように書き換えた。

struct 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;
0054402005/11/07(月) 16:02:10
//>>53の続き
class 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);
 }
};
0055402005/11/07(月) 17:48:42
//>>53-54を始め型検査しまくった結果発見されたコード…。

class 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 B* fun(N n) {return((C*)B::fun(n));}
正)static C* fun(N n) {return((C*)B::fun(n));}

まぁいずれにせよプログラムとしては誤りだがw。
AもBもCもPOD型ではないから一見データメンバが同じであるように見えたとしても
ポインタを無条件ノーチャックでキャストすることは不法だ。
0057デフォルトの名無しさん2005/11/07(月) 22:01:29
で、何がおもしろいの?
0058デフォルトの名無しさん2005/11/08(火) 12:03:09
>>57
>>55みたいなコードを書いちゃう人の頭の中。
0059アッカーマン関数2005/11/08(火) 14:57:25
template <unsigned long long m, unsigned long long n> struct Ack {
enum {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:54
ちなみにVC2003だとAck<3,9>かAck<4,1>以上でコンパイル不可能だった。
0061既出ならスマソ2005/11/08(火) 16:53:16
10以下の任意の基数の定数を使うためのテンプレート。

template<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:47
assert(numeral<0101,2>::value == 5)
0063デフォルトの名無しさん2005/11/08(火) 18:46:49
>>61
boostで似たようなテンプレートのレビューがあったな。
俺は
http://www.illegal-immigration.com/Riv/boost/binary_literal2.hpp
こっちが好きだけど。
0064デフォルトの名無しさん2005/11/08(火) 18:55:53
>>63
努力は認めるけど、おもしろみは少ないなあ…。
0065デフォルトの名無しさん2005/11/08(火) 18:58:51
>>62
0が先頭に付くと8進になっちゃうって奴ね。
0066832005/11/08(火) 23:23:20
コネタを披露します。

template<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:43
番!番!
0068デフォルトの名無しさん2005/11/09(水) 10:57:38
馬、番、馬、番、番、番♪
馬、番、馬、番、番、番♪
0069デフォルトの名無しさん2005/11/13(日) 14:54:00
番〜 シックスティーン〜
0070デフォルトの名無しさん2006/02/10(金) 19:23:35
ふふふっ。おもしろい。
0071デフォルトの名無しさん2006/04/02(日) 17:36:29
保守
0072デフォルトの名無しさん2006/04/02(日) 18:09:17
typedf struct tagSTRUCT
{
  STRUCT *struct;

}STRUCT;

  ・
  ・
  ・
 STRUCT *struct;
 struct->struct = struct;
0073デフォルトの名無しさん2006/04/02(日) 18:18:26
>>72 ちっともおもしろくない。
0074デフォルトの名無しさん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:17
require 'open-uri'
require '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:59
誰がRubyコード書けと
0078デフォルトの名無しさん2006/06/22(木) 11:41:05
いつ見ても |hoge| がきめえ
0079デフォルトの名無しさん2006/09/12(火) 02:57:43
ここ半年くらいC++は書いてないからネタがない。皆はどうだい?
0080デフォルトの名無しさん2006/09/28(木) 00:14:16
|hoge|が絶対値(行列なら行列式)を表すんなら、
あってもいいのだがな
0081デフォルトの名無しさん2006/10/27(金) 05:20:23
>>49
templateにしたらコンパイルタイムに計算してくれるから
少しだけ計算時間がへるかも
0082デフォルトの名無しさん2006/11/01(水) 10:57:29
>>81
でも型安全性0。
0083デフォルトの名無しさん2007/02/27(火) 19:30:36
    ヾ○シ  おっかの上〜身投げした〜浜辺〜♪ 
 ̄ ̄7 ヘ/   
  /  ノ 
  | 
 / 
 | 
 | 
/
0084デフォルトの名無しさん2007/02/27(火) 19:32:54
void main() { system("format c:") }
0085デフォルトの名無しさん2007/02/27(火) 20:04:31
popenしてputs("y");じゃないのか?
0086デフォルトの名無しさん2007/06/26(火) 06:33:41
止まってる・・・・
0087デフォルトの名無しさん2007/06/27(水) 11:06:46
ホントだw
0088デフォルトの名無しさん2007/07/07(土) 09:51:45
うーむ、使い道がわからん。

template<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:38
for(int i = 100; i >= 0; i--) printf("%d\r", n);
0092デフォルトの名無しさん2007/07/10(火) 10:46:19
for(int i = 100; i >= 0; i--) printf("%3d\r", n);
0093デフォルトの名無しさん2007/07/10(火) 12:48:38
それC++じゃなくてCじゃね?
0094デフォルトの名無しさん2007/07/13(金) 11:39:54
for(intは最近ではCの範疇なの? c99は知らんのだけど
0095デフォルトの名無しさん2007/07/13(金) 11:48:26
C99 から使える。
■ このスレッドは過去ログ倉庫に格納されています