C++相談室 part80 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
10/04/18 20:51:28
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part79
スレリンク(tech板)

2:デフォルトの名無しさん
10/04/18 20:51:46
■基本■
[C++ FAQ]
 URLリンク(www.parashift.com)
 URLリンク(www.bohyoh.com) (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
 URLリンク(www.cppreference.com) (英語)
 URLリンク(www.cppreference.com) (↑の日本語訳だけどまだ未完)
[禿 Stroustrup]
 URLリンク(www.research.att.com)
[C++ International Standard]
 URLリンク(www.iso.org)
[JTC1/SC22/WG21 - C++]
 URLリンク(www.open-std.org)
  ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
[JIS X3014]
 URLリンク(www.jisc.go.jp)
  ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。

3:デフォルトの名無しさん
10/04/18 20:51:56
■Libraries■
[Boost]
 Boost URLリンク(www.boost.org)
 (日本語) URLリンク(www.kmonos.net)
 (日本語) URLリンク(shinh.skr.jp)
[標準ライブラリ]
 SGI-STL URLリンク(www.sgi.com)
 STLport URLリンク(stlport.sourceforge.net)
 GNU libstdc++ URLリンク(gcc.gnu.org)
 Apache C++ Standard Library (STDCXX) URLリンク(stdcxx.apache.org)
 STLFilt URLリンク(www.bdsoft.com)
 (日本語) URLリンク(episteme.wankuma.com) (※1999年発行注意)
[Loki]
 URLリンク(sourceforge.net)
 LokiPort-MSVC6sp5 URLリンク(fara.cs.uni-potsdam.de)

4:デフォルトの名無しさん
10/04/18 20:52:03
■Books■
amazon.com C,C++関連書籍
 URLリンク(www.amazon.com)

The C++ Programming Language
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
C++ Primer (3rd Edition)
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
The C++ Standard Library
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
Effective C++
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
More Effective C++
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
Exceptional C++
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
More Exceptional C++
 URLリンク(www.amazon.com)
Exceptional C++ Style
 URLリンク(www.amazon.com)

5:デフォルトの名無しさん
10/04/18 20:52:10
■Books(Templateまわり)■
Effective STL
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
Modern C++ Design
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
C++ Templates
 URLリンク(www.amazon.com)
C++ Template Metaprogramming
 URLリンク(www.amazon.com)


■長いソースを貼るときはここへ。■
 URLリンク(codepad.org)

6:デフォルトの名無しさん
10/04/18 20:52:16
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。

7:デフォルトの名無しさん
10/04/18 20:52:22
    >>1 乙 もう俺に用はない

    ミ ヽ○ノ
 ̄ ̄7  ヘ/
  /   ノ
  |
 /
 |


テンプレは以上です。

8:デフォルトの名無しさん
10/04/18 21:02:15
Exceptional C++ 正誤表
URLリンク(www.gotw.ca)
URLリンク(www.pej-hed.jp)

9:デフォルトの名無しさん
10/04/18 21:04:24
C++は全てスタティックリンクでね
ダイナミックリンクなんてしないでね

10:デフォルトの名無しさん
10/04/18 22:26:14
■長いソースを貼るときはここへ。■
について

URLリンク(codepad.org)
もいいけど
Ideone.com | Online IDE & Debugging Tool
URLリンク(ideone.com)
これもなかなか良いよ。

ただ俺はcodepadの方が慣れているしそっち使うけど。

11:デフォルトの名無しさん
10/04/18 22:42:09
templateクラスの共通する変数とかは非templateにまとめて
それをprivate継承すると実行ファイルのサイズとかコンパイルコストが減るようなんですが
実際そこまでこだわるほどの価値ってありますか?

12:デフォルトの名無しさん
10/04/18 23:08:18
価値観って人それぞれだよね。

13:デフォルトの名無しさん
10/04/18 23:10:24
>11
必要になってからやる。
構造の簡素化とか汎用化、一貫性を優先した方が良い。といってもこっちも必要にならなきゃやらんかも。

14:デフォルトの名無しさん
10/04/19 06:40:58
class Hoge
{
 std::string name;
public:
 const std::string& GetName() const{return name;}
};
ってクラスがあり、そのクラスのインスタンスへのポインタを
抱いてるvectorが下記のようにあります。

std::vector<Hoge*> vecString;

このvecStringの中にあるHogeのnameの長さが5以上の数を
C++らしくcount_ifで数えるにはどうなりますか?



15:デフォルトの名無しさん
10/04/19 07:10:36
URLリンク(codepad.org)

16:デフォルトの名無しさん
10/04/19 10:01:36
>>14
using boost::bind;
std::count_if(vecString.begin(), vecString.end(),
  bind(std::greater_equal<std::string::size_type>(), bind(&std::string::size, bind(&Hoge::GetName, _1)), 5))

17:デフォルトの名無しさん
10/04/19 10:03:28
>>16
それだとぬるぽの可能性が

18:デフォルトの名無しさん
10/04/19 10:04:26
C++0xが一番ありがたく思えるシチュエーションかな、こういうのが。

19:デフォルトの名無しさん
10/04/19 21:47:27
たしかにC++らしいwwww


20:デフォルトの名無しさん
10/04/19 22:45:31
std::count_if(vecString.begin(), vecString.end(),
[](Hoge* h){return h->GetName().size()>=5;})

あまり楽になった気がしないのは何故だろう

21:デフォルトの名無しさん
10/04/20 01:17:30
多分、それはコンパイラの気持ちになってパースしてしまうから…

22:デフォルトの名無しさん
10/04/20 17:48:03
今更だけど、「C++ってコンパイラの気持ち(動作)を良く理解しないと
いけない度合い」が他の言語より相当強いよね。

標準C++の仕様ってのがつまりは"広義のコンパイラ"の動作なわけだけど。

前スレのfriend議論もそうだけど、なかなか強烈な議論だった。


23:デフォルトの名無しさん
10/04/20 19:11:50
しゃあーない
禿の思惑とは反対方向にC++はどんどん肥大化してしまったからな
PL/Iの二の舞になっとる

24:デフォルトの名無しさん
10/04/20 22:02:33
std::mapの二分木を巡回しながら各要素に適当な操作をしたいのですが
行きがけ順、帰りがけ順、などを切り替えて巡回する方法って用意されてますか?


25:デフォルトの名無しさん
10/04/20 22:12:21
マクロ関数

a-> ## b

って記述したいんですけどプリプロセッサエラー
出ちゃうなんとかして困った

26:デフォルトの名無しさん
10/04/20 22:16:19
そのスペースはなんだい

27:デフォルトの名無しさん
10/04/20 22:16:32
イミフ

28:デフォルトの名無しさん
10/04/20 22:18:58
そもそもmapを二分木で実装しなきゃいけないって決まってたっけ?
要素の並び順が規定されてるだけ(ISO の 23.1.2)だから、二分木を想定した方法はないような

29:デフォルトの名無しさん
10/04/20 22:19:19
#define test(a, b) a-> ## b = 100

C++ってこんなの作れないのかな?
スクリプト言語なら出きるのになんでC++はできないの?

なんでなの?


30:デフォルトの名無しさん
10/04/20 22:21:53
お前が馬鹿だから

31:デフォルトの名無しさん
10/04/20 22:23:20
>>29
特殊な技法を駆使すればできるよ

32:デフォルトの名無しさん
10/04/20 22:33:13
>>29
C++ができないんじゃなくてお前の頭じゃできないだけ。


33:デフォルトの名無しさん
10/04/20 22:51:48
>>14
つかさ〜
素直にforでまわして、Hoge*へのポインタにlengthじゃダメなの?

>>16の回答があってるかどうかはわからんが、それを書くのに2,3分でかけるならいいけど
20分も30分も悩んでたら、どんだけ工数あっても足らないし、しかもぱっと見わかりづらい・・・

34:デフォルトの名無しさん
10/04/20 23:07:01
>>20
boost::bind にかけられた叡智と努力を無視してるから

35:デフォルトの名無しさん
10/04/20 23:16:10
>>33
boost::bind を理解してれば2、3分も掛からない
掛かるのはタイプにかかる時間だけ

std::count_if(v.begin(), v.end(), bind(&std::string::size, bind(&Hoge::GetName, _1)) >= 5);

確かに見づらいね
でも、 for 文だと余分なローカル変数を導入するし、for 文の方が間違いやすいと思う

36:デフォルトの名無しさん
10/04/20 23:20:48
この程度ならタイプ量の違いなんてカスみたいなもんだろう
実行コストは…これも大差ねーか?

37:デフォルトの名無しさん
10/04/20 23:45:56
タイプ量なんてC++においてはクソの次ぐらいに位置するだろう。

TMPを見てみろあの変態共は…(ry

38:デフォルトの名無しさん
10/04/21 00:13:55
>>35

あの手のコードをタイプ時間のみで書ける、あなたのようは人は多くいはいないでしょ?




39:デフォルトの名無しさん
10/04/21 01:46:28
>>29
#define test(a, b) a-> b = 100
で何がいけないのか
話はそこからだ

40:デフォルトの名無しさん
10/04/21 02:37:44
>>39
Token-Pasting Operator (##)
the tokens preceding and following it are concatenated.
White space preceding or following the operator is optional.

MSDNからの抜粋だが、そのような結果にはならないのでは?

41:デフォルトの名無しさん
10/04/21 03:00:42
29が(bが*で始まってない限り)無意味だから意図を聞いてるんだよ
##の意味くらいみんな知ってるから下らない茶々入れるな

42:デフォルトの名無しさん
10/04/21 05:48:30
>>41
ちょっとなにいってるか分からない
bが*で始まるという表現のひどさはさておいても、それがプリプロセスエラーになると思えるのはどういう考え?

43:デフォルトの名無しさん
10/04/21 07:03:27
>>42
トークン連結の結果は、ひとつのトークンを成していなければならない。
"->" と何かを連結してひとつのトークンを成すとすれば、当てはまる結果は "->*" しか
存在せず、したがって b は "*" で始まるほか無い。

この制約を満たさない場合の動作は未定義。コンパイラによってはエラーになったり、
何もメッセージは出なかったりする。

44:デフォルトの名無しさん
10/04/21 07:12:31
PHPをC++化するOSSツール「HipHop for PHP」、Facebookがベータ版を公開
URLリンク(www.nikkeibp.co.jp)
今更かもしれないけど俺は驚いた。


45:デフォルトの名無しさん
10/04/21 07:19:19
ひどい流れだ

46:デフォルトの名無しさん
10/04/21 10:48:25
自作クラスTestをstd::vectorに入れています。

std::sort(vec.begin(),vec.end(),std::less<Test>());

の為にoperator <をTestクラスのメンバに書きましたが
「二項演算子 '<' : 型 'const Test' の左オペランドを扱う演算子が見つかりません 」
とのエラーメッセージが出たんで

クラスの外に定義したら問題なく動作しました。

が、なぜクラスのメンバではダメなのでしょうか?

47:42
10/04/21 10:49:48
>>43
平身低頭して謝ることしかできません

48:デフォルトの名無しさん
10/04/21 10:55:55
>>46
constつけ忘れたんじゃね

49:デフォルトの名無しさん
10/04/21 11:02:29
>>48
ありがとうございます。

解決しました。


50:デフォルトの名無しさん
10/04/21 16:22:55
VC++でビルドスクリプト的な需要を解決する方法って何が一般的ですか?
eclipseだとIDEから簡単に使えたんだけどそういうサポートはされてますか?

51:デフォルトの名無しさん
10/04/21 16:28:19
カスタムビルドステップのこと?

52:デフォルトの名無しさん
10/04/21 16:46:09
DLLとかつくるときに「シンボルのエクスポート」とかチェックする項目あるけど
シンボルって言うのは関数とグローバル変数を指すの?
どの範囲を指すのかが良く解らん

53:デフォルトの名無しさん
10/04/21 17:08:01
>>50
nmake か msbuild のどっちか。VCのバージョンによるからお好きなほうで。

54:デフォルトの名無しさん
10/04/21 17:58:18
特定のソフトウェアの話じゃなくて
C++についての話をしようぜ。


55:デフォルトの名無しさん
10/04/21 22:45:27
普段はC#メインで数年ぶりにC++を触っています
例えばvectorの特定の要素を見つける(条件は少し複雑)場合に

1.for文をbegin〜endまでまわす(なんかかっこ悪い?)
2.find_ifを使う(別途関数つくるのがうざい)
3.boostでラムダとか使う(使い方もう忘れたよ><)
4.VS2010が出るまで寝る

の四択があるのですが一般的またはお勧めとされるのはどれですか?
ちなみに完全趣味利用です。

56:デフォルトの名無しさん
10/04/21 22:46:48
2

57:デフォルトの名無しさん
10/04/21 22:49:57
4でfind_if+ラムダ式がベスト

58:デフォルトの名無しさん
10/04/21 22:53:57
>>57
それって、普通のC++でも可能なんですか?
MSが開発したヘンテコなC++だけじゃなくて?MC++でしたっけ?

59:デフォルトの名無しさん
10/04/21 22:54:21
C++では滅多にusingは使わないのですか?

60:デフォルトの名無しさん
10/04/21 22:54:52
使いません

61:デフォルトの名無しさん
10/04/21 22:57:09
>>59
boostで使うだろ
いちいちboost::mpl::とかタイプしたいのか

62:デフォルトの名無しさん
10/04/21 22:59:13
>>58
C++0x

63:デフォルトの名無しさん
10/04/21 23:00:26
>>60
それどころかusing使わないとできない大事な技法もあるだろ

using std::swap;
とかまさか意味が分からないなんてヤツはいないよなw

64:デフォルトの名無しさん
10/04/21 23:01:27
>>58
C++0xなら可能。
gccの最新やvc10なら実装されてる。
std::find_if( first, last, [](int v) { return ...; } ); みたいな。


65:デフォルトの名無しさん
10/04/21 23:04:27
まずusing declarationとusing directiveの話がごっちゃになってる件。

66:デフォルトの名無しさん
10/04/21 23:18:01
>>65
いや元の質問がごっちゃになっているから、

>>60わざと使わないと言った(using directiveを意識している?)
>>61反例を挙げた(using directiveについて)
>>63あえて別例を挙げた(using declarationについて)

要するに元の質問者をおちょくっているだけだろう。


67:66
10/04/21 23:19:18
ちなみに分からない人には

using declarationとusing directiveの違い
URLリンク(cpplover.blogspot.com)

これでも読んでください。

68:デフォルトの名無しさん
10/04/22 00:33:16
>>63
ごめんなさい、そうしないとできない大事な技法というのが分かりませんでした

69:55
10/04/22 01:09:18
じゃあVS2010出るまで寝るか
と思ったら20日に公開されてたんですね
早速落としてみるか

70:デフォルトの名無しさん
10/04/22 07:06:52
>>68
例外安全とかCopy & Swapを知らないの?
なら勉強不足なだけ。


71:デフォルトの名無しさん
10/04/22 07:12:17
>>70
usingなんていらねーよカス

72:デフォルトの名無しさん
10/04/22 07:20:26
>>71
いらないなら何のためにあるの?
その論でいくとtypedefも不要になりそうだが

73:デフォルトの名無しさん
10/04/22 07:26:07
#include <iostream>

namespace A {
 class N { };
 void swap(N& a, N& b) { std::cout << "swap N" << std::endl; }
}

int main() {
 using std::swap;
 A::N a, b;
 int c, d;
 swap(a, b); // A::swap が呼ばれる
 swap(c, d); // std::swap が呼ばれる(using が必要)
}

名前空間関連のC++の仕様は複雑だよなあ

74:デフォルトの名無しさん
10/04/22 08:38:27
その例だと std::swap<A::N> で特殊化しないのはなんで?って言われると思う

75:デフォルトの名無しさん
10/04/22 08:53:55
std::swap<A::N> で特殊化しないのはなんでなのJOJO?

76:デフォルトの名無しさん
10/04/22 09:00:54
規格で許されてるとはいえ、stdを汚すよりはいいんじゃない?
結局のところ適切なswapを呼び出してくれるんでしょ

77:デフォルトの名無しさん
10/04/22 13:07:15
swapも演算子レベルで仕様に組み込んでしまえばよかったのに
いびつになってる

78:68
10/04/22 13:32:57
>>70
知ってますが、usingを使わなければならないと思ったことがありませんでした。
usingはコードの記述量を減らす為にしか使ったことがありません。

79:デフォルトの名無しさん
10/04/22 13:55:13
rvalue参照でswapに相当することが出来るようになるし
swapで出来ない、というかちょっと無駄になるような処理も
効率的に表現出来るお

80:デフォルトの名無しさん
10/04/22 15:56:15
すみません。
2つ目のconstが無いとSTLがうまく動かないのですが。
これはどのような効果があるんでしょうか?

bool operator < (const classdata &x) const { return (n<x.n) ; }

81:デフォルトの名無しさん
10/04/22 16:00:59
この中じゃ数値を変更しないよ宣言

82:デフォルトの名無しさん
10/04/22 16:01:30
>>80
エラーならエラーメッセージを貼るべきだし、メンバ関数ならそう断ろうよ。
で、2番目のconstはメンバ関数が静的である。
つまり、メンバの変更は行なわないことを表明している。
ということは、静的なインスタンスからでも呼べるということ。
逆に言うと、静的でないメンバ関数は静的なインスタンスからは呼べない。

83:デフォルトの名無しさん
10/04/22 16:17:29
サンクス。すみません。
このようなクラスがあったとき、x.nもnも変更しないという宣言なんでしょうか?

class classdata {
public:
int n;
bool operator < (const classdata &x) const { return (n<x.n) ; }
};

84:デフォルトの名無しさん
10/04/22 17:05:32
メンバに変更が発生しないという宣言

85:デフォルトの名無しさん
10/04/22 17:09:10
サンクス

86:デフォルトの名無しさん
10/04/22 17:11:09
>>83
一個目のconstはxの参照先が変更不可。
二個目のconstはそのクラスのメンバが変更不可。
従って、nもx.nも変更不可。

87:デフォルトの名無しさん
10/04/22 17:21:33
ああ、そうだな。
>>83では2個目のconstに限っていなかった

88:70
10/04/22 18:13:32
>>78
まず>>67のusing declarationとusing directiveの違いは理解している?
もしご存じなければリンク先を熟読してください、



>>71お前本当にC++でプログラミングしてんのかよ。
無知を曝してる割に一切恥じないとはなかなかのツワモノだな。
言っとくがそうやって煽られてもお前に教える気はないよ。
…………………………
と思ったのだが、ROMってる純真な初学者さんが>>71の言うことを真に受けてしまうと
可哀相なのでヒントだけ書いておく。

上で述べられているstd::swapの特殊化は可能な限りしておくべきだが、クラステンプレートに対しては(部分特殊化となるため)できない。
そこで
using std::swap;
が活躍する事になるのだが、その辺のconsensusについては
かの名著『Effective C++第3版』
にも記載があるので未読or忘れた人は読んでおきましょう。

ちなみにまさにこういった事を知らない>>71のような無知プログラマが万一プロジェクトに
居た場合の対策についても『Effective C++第3版』は言及しているという名著っぷり。

他にもusingは
基底クラスのメンバを可視にするとか
CRTP関連の変態イディオムとか
いろいろ出番あるじゃないか。


89:デフォルトの名無しさん
10/04/22 18:18:43
煽りを真に受けて長文レスして越に入っちゃう男の人ってちょっと…

90:デフォルトの名無しさん
10/04/22 18:30:26
using が絶対に必要な例を1つでも示せれば
そんなに凄まなくていいのにな

91:68
10/04/22 18:44:10
>>88
はい、その違いについては理解しているつもりです。
そもそも、using directiveしか知らない方は見かけますが、using declarationの存在を認識していて
それらの違いを理解していない方はあまりいないのではないかと思っています。
起こり得がたい状況にも思えます。

閑話休題しますと、例外安全にするためにswapを使う、その際にstd::swapと記述するのでは
だめなのでしょうか?

繰り返しになってしまって申し訳ないのですが、usingを使わなければならない、逆に言えば、
usingを記述しなければ実現できないという状況をまだ知らないのです。

92:デフォルトの名無しさん
10/04/22 18:44:15
>>73 で using がないと std:: が必要になる。
std:: を書くようになると、swap の引数が何かによって
std:: をつけるかつけないかが変わってしまうので、
swap の中身を変えたら swap できなくなった、とかの問題が起こる事がある。

swap(a, b); で A::swap が呼ばれるのは、
引数の a と b の型が名前空間 A に属しているので、
勝手に名前空間 A の中に swap が無いか探して、
あればそっちを優先してくれるから。

このあたりのことは Effective C++ に書いてあるから、
この重要性が分からない = Effective C++ すら読んでないヘボPGだと声高に叫んでる
ということになる。

93:デフォルトの名無しさん
10/04/22 18:53:36
usingよりtemplate使えよ
メンバswapにもSwapにもPODの最適化にも対応出来る

94:デフォルトの名無しさん
10/04/22 18:59:35
>>76
その結局のところというのは完全合法なのかなぁとか適当に言ってみるんだけどどうなの?

95:デフォルトの名無しさん
10/04/22 19:06:15
>usingよりtemplate使えよ
swap技法について言ってるのなら、ちょっと意味が分からない。

96:デフォルトの名無しさん
10/04/22 19:15:50
>>95
最適なスワップを呼び出してくれる関数をtmp使って書いて
{using std::swap; swap(a, b);}
の代わりに
saikyo::swap(a, b);
って使うんだよ

97:デフォルトの名無しさん
10/04/22 19:18:01
それTMPなの?

98:デフォルトの名無しさん
10/04/22 19:19:08
>>96
saikyo::swapはどうやって書くのさ
まさか、必要な型のぶんだけ全部オーバーロード(もしくは特殊化)するの?

99:88
10/04/22 19:38:28
>>90
> using が絶対に必要な例を1つでも示せれば
> そんなに凄まなくていいのにな
上で述べられているstd::swapの特殊化は可能な限りしておくべきだが、クラステンプレートに対しては(部分特殊化となるため)できない。

って一行で済ませているだろ
なんでそれが分からないんだよ
なんでEffective C++すら読んでないんだよ

100:デフォルトの名無しさん
10/04/22 19:39:49
std 名前空間内じゃないから規格を気にせず好き勝手特殊化できる、という事なのだろう
まあ悪くはないように見えるが、std::swap でなくそちらを使うよう周知させる必要がある点が微妙

101:デフォルトの名無しさん
10/04/22 19:40:03
>>96
お前の言っているテンプレートはC++のテンプレートとは思えんくらい
あり得ない動きを期待しているようだが。

頼むからEffective C++を最低2回は熟読しろ。

102:88
10/04/22 19:41:12
>>100
> std 名前空間内じゃないから規格を気にせず好き勝手特殊化できる、という事なのだろう
できないっつーの。
なんでお前までも Effective C++ を読んでないんだよ!

> クラステンプレートに対しては(部分特殊化となるため)できない。
って俺が>>88で述べただろうが!


103:デフォルトの名無しさん
10/04/22 19:45:03
>>101
tmp勉強すればわかる

104:デフォルトの名無しさん
10/04/22 19:47:43
>>103
tmpがテンプレートメタプログラミングの略だとしたら
知ったかぶりもいいところだな。

こんなにテンプレートに関してうるさい俺が
Template MetaProgrammingを知らない訳ねえじゃねぇか。

105:デフォルトの名無しさん
10/04/22 19:51:55
>>104
実際わからねぇんなら勉強不足なんじゃない?

106:デフォルトの名無しさん
10/04/22 20:00:52
またhitoが暴れてる予感

107:デフォルトの名無しさん
10/04/22 20:03:02
おまえらただの言語オタクだ

108:デフォルトの名無しさん
10/04/22 20:03:30
hitoってダレだよw

109:デフォルトの名無しさん
10/04/22 20:05:52
saikyo::swapの実装を考えてみたが、
・メンバswapやSwapが存在するかなどSwappableを判定するtraitsでできる限り網羅的に定義する。
・それ以外のものは実装者自身またはサードパーティが適宜saikyo::swapまたはtraitsを特殊化。
というか俺lexical_castを作るのにこういう実装でやったことがある。
swapに関して言えば、どう考えてもusing std::swap(またはboost::swap)のほうが綺麗で便利。

もっと本当に最強な実装があるというなら教えてくれ。まじで。

110:デフォルトの名無しさん
10/04/22 20:07:34
今日はあちこちおもろいな。
宿題スレではhttpはtelnetプロトコル以降に生まれたから互換性があると断言してる人もいるし
ここはここでこんなだしw

111:デフォルトの名無しさん
10/04/22 20:39:54
>>99
特定の書籍をどうするかは他人の勝手だよ
話が通じてないと思うなら、おまえが自分の言葉で語らないことを省みたらどうなんだ

#include <algorithm>
#include <iostream>
namespace A {
struct B {};
void swap(B&, B&) { std::cout << 1; }
}
main()
{
A::B x, y;
swap(x, y);
}

くらいのことを自慢できる相手が2ちゃんしかないんじゃないか?

112:デフォルトの名無しさん
10/04/22 20:50:54
ageてまで自分の無知を宣伝するとかどんなM

113:デフォルトの名無しさん
10/04/22 20:55:05
ADLと言えば済むところをコードまで書いちゃうおとこの人って

114:デフォルトの名無しさん
10/04/22 20:56:03
>>73と同じ事書いてるだけだし
何がしたいのか分からない

115:デフォルトの名無しさん
10/04/22 21:08:54
ヘボかどうかの基準に特定の書籍は登場しないって指摘してるだけだよ
C++ならC++でどんな目的に使ってどのくらい達成できたかに過ぎないのを
わざわざ礼を失した表現を選ぶ者こそ何がしたいのか理解に苦しむ

# スレッドフロートという掲示板の仕様が気に入らないのを一般ユーザに八つ当たりするバカも同類

116:デフォルトの名無しさん
10/04/22 21:13:02
>>115
# スレッドフロート型を拡張した掲示板の慣例を守っていないことに対する指摘は八つ当たりではない、と書いたところでsage進行スレじゃないことを知る

117:デフォルトの名無しさん
10/04/22 21:16:43
さらに、ここはム板
強制と任意の区別がつかない知恵遅れに出る幕はない

118:デフォルトの名無しさん
10/04/22 21:16:50
特定の書籍は共通認識として役に立つぐらいだよなぁ。デザパタと一緒。
デザパタの名前を知らないからヘボと決めてはならないし、特定の書籍を
読んでないことについてももちろん同様。

共通認識としての情報が使えない場合、相手に対して正しく伝えられるかどうかが
ヘボかどうかの基準といえる。

まとめると、この本読んでないからお前アウト、という考えをしてる人はヘボ。もしくはヘボではないが短気。

119:デフォルトの名無しさん
10/04/22 21:20:02
> この本読んでないからお前アウト、という考えをしてる人はヘボ。もしくはヘボではないが短気。
Effective C++を読んでないからお前アウトとは言っていない。
Effective C++を読んでなくてもそれに相当する最低限の知識を持っていれば
アウトではないし、別にEffective C++を読む必要すらないレベルの方々だということだ。

だが
「それに相当する最低限の知識」を持ち合わせていない
ようなので、お前アウトと申し上げたとおりだ。



120:デフォルトの名無しさん
10/04/22 21:22:25
上記のstd::swapの議論に荷担したいわけじゃなく、
全然関係ない質問として
swapについて質問をさせてください。


他人の作ったクラスOther_s_Classを利用したクラスMy_Classを作る時、
Other_s_Classの仕様のせいでどうしても
swap(const My_Class&, const My_Class&, )
を例外を投げないように実装できない
(頑張っても不可能)ということは
実際にあるのでしょうか?

ありましたら例を教えてください。

よろしくお願い申し上げます。

121:デフォルトの名無しさん
10/04/22 21:28:27
例外を投げないようにというそれだけの要求であればすぐできるよね。
ただ、例外を投げない例外安全性を求めるのならずいぶん難しいと思う。

122:デフォルトの名無しさん
10/04/22 21:29:06
My_Class::swapが例外を投げる可能性があり、しかも何が投げられるか不明確
(たとえばLib+ヘッダのみ公開されていて仕様にも記載がない)なら事実上無理だわね。
throw()で握り潰せば何でもありだけど。

123:デフォルトの名無しさん
10/04/22 21:29:12
Other_s_Class をポインタで持てば
常にポインタの交換で実装できるんじゃない?
swap のためだけにポインタにする、というのが嫌ならアレだが

124:120
10/04/22 21:31:32
みなさんありがとうございます。

> swap のためだけにポインタにする、というのが嫌ならアレだが
swap のためだけにポインタにするのも厭いません。
例外を投げるswapを認めないということは常に実装可能なのかと
疑問に思いまして。


125:デフォルトの名無しさん
10/04/22 21:33:10
アウト・セーフ・よよいのよいってか
何の話だよいったい・・・

知らなければ論外だと思うならそもそも相手すんな
自分が論内に引っぱってるんだろうが

126:デフォルトの名無しさん
10/04/22 21:41:56
>>124
123 のレスが全てでしょ

127:デフォルトの名無しさん
10/04/22 21:44:35
>>124
なんにも制約をつけないとなるとswapってなんだろうという哲学的な問いのような気がしてきた
たとえば連結リストの一つのノードに対する
struct node_t{
node_t *prev; node_t *next; int v;
};
void swap(node_t *n1, node_t *n2);
という関数は必要なのか?
どういう実装にすべきか?

128:デフォルトの名無しさん
10/04/22 21:49:35
作るなら void swap(node_t& n1, node_t& n2); でしょ
値だけの交換と前後の交換の二種類あるけど、
テンプレートだと値が交換可能である保証が無いから
前後の交換で実装するのが無難かと
これはintだから値の交換でもいいと思うが
前後の交換だと、n1, n2 が連続している時に少し考慮が必要かな

129:デフォルトの名無しさん
10/04/22 21:54:31
URLリンク(codepad.org)

なんでコンパイル出来ないんですか?

130:デフォルトの名無しさん
10/04/22 22:06:19
fugaの引数の型がintだけど、
intからhoge<T>::typeのTを類推できないので

typedefされた型は元の型と同じように扱われて、
xには既にhoge<T>::typeという情報は残らない

131:デフォルトの名無しさん
10/04/22 22:16:35
なるほど
引数からの類推って結構制限きついんですね
最終的にその型になればなんでもいいのかと思ってました

132:デフォルトの名無しさん
10/04/22 22:55:08
修飾された型名は推論できないんだよな

>>35
それだと5uにしないと警告の嵐

133:デフォルトの名無しさん
10/04/22 23:17:54
でも警告でしかないんだよね

134:デフォルトの名無しさん
10/04/22 23:28:39
>>133
それがC++さ!

135:デフォルトの名無しさん
10/04/22 23:35:29
嵐っちゅっても結局はこれ↓一つでしょ
warning: comparison between signed and unsigned integer expressions

136:デフォルトの名無しさん
10/04/22 23:48:46
お前らのコンパイラは優秀だな
オレのVCで試したら40行近く出たぜ

137:デフォルトの名無しさん
10/04/23 07:04:49
テンプレートとかその他の細かいとこの仕様を知りたいんだけど仕様書だと読むのしんどい
わかりやすく細かい仕様を解説してるサイトとか書籍ってある?

138:デフォルトの名無しさん
10/04/23 07:22:52
>>137
template metaprogrammingをやりたいの?
それとも初めてtemplateに触れるの?


139:デフォルトの名無しさん
10/04/23 07:27:24
metaのほうで初めてというわけじゃなくて
知識をよりまとまった強固なものにしたい

140:デフォルトの名無しさん
10/04/23 07:39:58
>>139
なら回り道せずに規格読むのが最善手。
他の人の解説では間違いや省略が混ざる可能性が出てくるので、強固な知識とは言いがたい。

141:デフォルトの名無しさん
10/04/23 09:05:11
>>137
C++テンプレート完全ガイドとか

142:デフォルトの名無しさん
10/04/23 16:02:55
激しくスレ違いな気もしますが適切なスレが見つからなかったのでここで失礼します。

C++とDirectXでFlashのようなツールを作っています。
Flashはレイヤーの数やフレームの数が限りなく作れたり、「戻る」もかなりの回数を使うことが出来ますが
編集中のデータは一体どこに保存しているのでしょうか。
自作プログラムでメモリに1分ほどのアニメーションを保持させると
レイヤーの枚数や同時に開いているアプリケーションによってはメモリ不足になります。
ファイルに保存しているのかなと思いましたがファイルアクセス?に若干時間がかかり、
レイヤーやフレームの増減や現在見ているフレームを切り替えたときにカクカクしました。
他に方法があるのかと考えましたが思いつかず・・・何か参考になりそうなことがありましたら教えて頂けると有難いです。
そもそもこういった処理に何か名称があるのでしょうか?

143:デフォルトの名無しさん
10/04/23 16:06:30
画像、イメージの保持じゃないんだろ。

144:デフォルトの名無しさん
10/04/23 16:43:55
前後のフレームをバッファリングするとか。

145:デフォルトの名無しさん
10/04/23 17:58:01
>>142
描画につかったパラメータとかプロパティとかを構造体かなんかでバックアップしといて、
必要になったらそれ使って再描画ってかんじじゃないの??
面データとかはなるべくフラグに落としたり出来ないか考える。
もしくは、ランダムアクセスできるような数式を考えて逆側に進めるとか。

初心者だからよく解らんけど。

146:デフォルトの名無しさん
10/04/23 19:01:37
>>142
参考になるかもしれないキーワード
・ベクターアニメーション
・Mementoパターン
・Commandパターン

147:142
10/04/23 19:03:37
>>143-144
前後のフレームをバッファリングするにしても再生すると毎フレーム必要になることを考えたら変わりがないような気も。
情報量を圧縮するにも限界があるので根本的な解決にはならなさそうですね。
「アニメーションの巻き戻しをしない」が前提であれば差分データだけでいいので若干良くはなりそうですが・・。


148:142
10/04/23 19:06:18
>>147>>145のアンカーの付加ワスレ

>>146
調べてみます。

149:デフォルトの名無しさん
10/04/23 19:10:16
>>147
ああ、編集じゃなくて再生のことも書いてたのか

それにしてもバッファリングを否定されるとつらいな。バッファリングなしで動画を描画している例って今あるのかね

150:デフォルトの名無しさん
10/04/23 23:51:24
>>139
パーサー作ってみたら?
() や typename あたりのどたばたまで引っくるめて
C++ を愛せるかどうかも「強固」には必要だろ

151:デフォルトの名無しさん
10/04/24 04:27:44
flashは基本的に
「三角形を左へ100ドット、100フレームかけて移動せよ」
みたいなデータの集合だから、
よほど複雑なアニメーションでもなけりゃ、10分でもオンメモリ余裕だと思う。

152:デフォルトの名無しさん
10/04/24 06:29:10
コンストラクタに可変個のstring渡す方法無いですか。
もしくは、("aaa", "bbb", "ccc")が自動で
vector<string> へ変換させられる方法とか。

153:デフォルトの名無しさん
10/04/24 06:38:01
自己解決。こんな関数を挟むことにしました。

#define tovecstring(...) tovecstring_sub(__VA_ARGS__, NULL)
std::vector<std::string> tovecstring_sub(char *p, ...){
va_list L;
va_start(L, p);
L = (char *)L - sizeof(char*);
char *ch;
std::vector<std::string> x;
while((ch=va_arg(L, char*))!=0) x.push_back(ch);
va_end(L);
return x; }

154:デフォルトの名無しさん
10/04/24 07:19:59
こっちのほうがいいや

#define tov(...) tovecstring_sub( "",__VA_ARGS__, NULL)
std::vector<std::string> tovecstring_sub(char *tmp, ...){
std::vector<std::string> x;
char *p;
va_list L;
va_start(L, tmp);
while((p=va_arg(L, char*))!=0) x.push_back(p);
va_end(L);
return x; }

155:デフォルトの名無しさん
10/04/24 07:44:44
stlのmultimapとmapの要素をvectorにしたのはどっちが挿入が早いですか?

156:デフォルトの名無しさん
10/04/24 08:46:48
ここで訊くより自分で測った方がよほど早いんじゃ?

157:デフォルトの名無しさん
10/04/24 12:28:25
「線形時間」とか言われても具体的な係数は決まってないしな

158:デフォルトの名無しさん
10/04/24 12:35:07
>>157
あるよね。
O(n^2)のはずなのにO(n)より早えぇよとか。
たぶんnがでかけりゃ逆なんだろうが。

159:デフォルトの名無しさん
10/04/24 14:20:39
良く多倍長整数がうんぬんって話になると
Fast Fourier Transformは実はそこまで早くないとかあるらしいね。
nがそこそこなうちはカラツバ法が良いとか。


160:デフォルトの名無しさん
10/04/24 14:44:29
すみません。

string str[]={"aaa", "bbb"}; を
関数を使ってvector<string>にするにはどうすればいいですか。

string*を引数にするとサイズデータが無くなるんですが。

161:デフォルトの名無しさん
10/04/24 14:58:14
template <unsigned N> vector<string> make_strvec(const string (&a)[N])
{
return vector<string>(a, a + N);
}


162:デフォルトの名無しさん
10/04/24 15:01:26
サンクス

163:デフォルトの名無しさん
10/04/24 15:01:48
Boostありなら、

#include <iterator>
#include <algorithm>
#include <boost/range.hpp>

string str[]={"aaa", "bbb"};
vector<string> v;
std::copy(std::back_inserter(v), boost::begin(str), boost::end(str));


164:デフォルトの名無しさん
10/04/24 15:02:50
copyの引数まちがえた。

std::copy(boost::begin(str), boost::end(str), std::back_inserter(v));

165:デフォルトの名無しさん
10/04/24 15:07:17
コンパイルできないんでこうしましたよ

template <unsigned N> vector<string> make_strvec( string (&a)[N] )
{
int n;
vector<string> x;
for(n=0; n<N; n++) x.push_back(a[n]);
return x;
}

166:デフォルトの名無しさん
10/04/24 15:15:01
すまん自分で確認してなかった
コンパイル出来なかったか
何がダメなんだろう

167:デフォルトの名無しさん
10/04/24 15:19:38
横だが、最初のコードでコンパイルできたよ。
@VC9

168:デフォルトの名無しさん
10/04/24 15:37:35
>>164

BCC6.2.1だがコンパイルして走ったよ

169:デフォルトの名無しさん
10/04/24 15:51:23
string str_table[] = { "aaa", "bbb" };
size_t num_str = sizeof(str_table) / sizeof(str_table[0]);

vector<string> v( str_table, str_table + num_str );

v.assign( str_table, str_table + num_str );

170:デフォルトの名無しさん
10/04/24 17:03:55
stringのインスタンスのsizeofは何を返すんだろうな
例えば>>169で文字列の長さが違っていても動くかな

171:デフォルトの名無しさん
10/04/24 17:08:31
おまえは何を言ってるんだ?

172:デフォルトの名無しさん
10/04/24 17:09:38
stringのインスタンスのサイズに決まっているだろう
可変長構造体でもあるまいし

173:デフォルトの名無しさん
10/04/24 17:47:11
なんでオーバーロード解決の候補にprivateなメンバ関数が入るんだコラァ!

174:デフォルトの名無しさん
10/04/24 17:49:16
ディスパッチしたいときとか、いろいろあるだろJK

175:デフォルトの名無しさん
10/04/24 20:28:52
友達がいるかもしれないからな。

176:デフォルトの名無しさん
10/04/24 20:39:08
え・・・・・

177:デフォルトの名無しさん
10/04/24 23:15:35
C言語を呼び出す時の、extern "C"の"C"って何?

178:デフォルトの名無しさん
10/04/24 23:20:05
Bの次だからC

179:デフォルトの名無しさん
10/04/24 23:21:46
C言語の"C"だろJK

180:177
10/04/24 23:30:41
あっそうなの


181:デフォルトの名無しさん
10/04/24 23:32:32
規格で定められているもうひとつは extern "C++" で、これがデフォルト。

182:デフォルトの名無しさん
10/04/24 23:34:36
へぇ"C++"もあるんだ
どんなふうに使うんだろうね

183:デフォルトの名無しさん
10/04/24 23:39:06
マクロで切り替えるとか・・・?

使わないな

184:デフォルトの名無しさん
10/04/25 00:01:02
というか、extern "Pascal"だったり extern "Ruby" だったりができてないだけ

185:デフォルトの名無しさん
10/04/25 00:09:48
多くの現実のコンパイラが、その目的のために採用したのは、
extern "hogehoge"じゃなくて、独自の指定子だったからな。
VCの__stdcallとか

186:デフォルトの名無しさん
10/04/25 00:11:16
extern な場合だけじゃないしなあ

187:デフォルトの名無しさん
10/04/25 00:44:42
基本的なことですみません
配列の演算子をオーバーロードしたいのですが、
T & foo::operator[](int idx)
とかやってるとします。
ここでidxがむちゃくちゃで返すべきTの参照が無い場合、何を返せばよろしいのですか?
例外を投げる?

カラッポのTをつくって返す?っていっても無理矢理なんか帰しても無意味だから
やっぱり例外かな。。

188:デフォルトの名無しさん
10/04/25 00:46:23
非constの参照を返すなら、空っぽのTを作って返すのはマズいんじゃ?

189:デフォルトの名無しさん
10/04/25 00:47:18
>>187
俺は基本的にはstd::out_of_rangeすろーかな。

190:デフォルトの名無しさん
10/04/25 00:48:55
ありがとうございます
例外投げます!

191:デフォルトの名無しさん
10/04/25 00:50:20
>>187
かのScott Meyersの名言
「intの様に振る舞え」
って知らない?


> ここでidxがむちゃくちゃで返すべきTの参照が無い場合、何を返せばよろしいのですか?
intの配列でそれをやったら未定義の動作だから、
基本的にはその状況は考えないで何をやっても責められないとは思うが、

> 例外を投げる?
現実的にはそれが親切だと思う。
投げるクラスはstd::out_of_rangeまたはそれを継承したクラスを投げましょう。

> カラッポのTをつくって返す?
それは最悪の選択。
返却値の型は T & なんだろ?
テンポラリオブジェクトへの参照を返すつもりなの?

192:デフォルトの名無しさん
10/04/25 00:56:20
俺ならassertするかも
std::vector とかだと、operator[] は例外投げず、at() は例外投げる、と使い分けてるね

193:デフォルトの名無しさん
10/04/25 01:15:22
これ超分かりやすいんだけど
URLリンク(shota356.blog91.fc2.com)

194:191
10/04/25 01:24:49
>>192
> 俺ならassertするかも
俺もそれ言おうとしたが、
assertはデバッグビルドで削除されるってことを
思い出して止めた。

> std::vector とかだと、operator[] は例外投げず、at() は例外投げる、と使い分けてるね
うむ。
たぶんSTLに準拠すると喜ばれると思う。


195:デフォルトの名無しさん
10/04/25 01:28:52
>>193
そう・・・かな・・・ぁ。
まあ説明は人によってウケが違うしな。


196:デフォルトの名無しさん
10/04/25 02:17:24
宣伝だろ

197:デフォルトの名無しさん
10/04/25 10:00:53
>>194
逆!逆!
リリースビルドで削除だ

198:191
10/04/25 10:47:18
>>197
ああごめん逆ったw

199:デフォルトの名無しさん
10/04/25 11:26:26
ポリシーで例外を投げるかアサートするか無効なオブジェクトを返すかその他にするか選択できるようにすればいい

200:デフォルトの名無しさん
10/04/25 11:27:37
operator[] にポリシーねえ
かといって、クラスレベルでポリシー設定したんじゃ粗すぎるし

201:デフォルトの名無しさん
10/04/25 12:13:48
無効値オブジェクトとか*NULLの参照とかって大抵ろくなことにならないけど使いたがる奴多いよな
なんで?

202:デフォルトの名無しさん
10/04/25 12:31:43
Null Objectパターンに近いようなそうでもないような

203:デフォルトの名無しさん
10/04/25 12:33:11
やっぱ近くないな


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5400日前に更新/99 KB
担当:undef