C++相談室 part80 ..
[2ch|▼Menu]
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
やっぱ近くないな

204:デフォルトの名無しさん
10/04/25 14:30:31
>>201
クソ設計だけど、もうそうするしかないほど追い詰められている時に
「とりあえず動けばいいんだよ!早く作り終えないとけないし!」
ってなった結果じゃないかな?

205:デフォルトの名無しさん
10/04/25 14:44:08
誰もがいつでも例外を投げれていい環境で働いてるワケじゃないんだぜ

206:デフォルトの名無しさん
10/04/25 15:10:07
>>205
あー、なるほどね。
・・・その場合、Boostとか使えないの?
例えばboost::lexical_cast<std::string>()とかどうするの?
例外を投げないオプションとかあるのかな?


207:デフォルトの名無しさん
10/04/25 15:15:53
あれだ
goっぽくtupleでも返すとか

208:デフォルトの名無しさん
10/04/25 15:16:02
GoogleだとboostどころかSTLも禁止じゃなかったっけ
bad_allocとかout_of_rangeとか投げるから
そういうとこだと完全に独自ライブラリ

209:デフォルトの名無しさん
10/04/25 15:19:21
例外禁止って、さらに new が禁止で2段階初期化が強制になるんだろ?
よく聞く話だけど、そこら辺まで考えての判断なのか疑問だね。

210:デフォルトの名無しさん
10/04/25 15:22:04
例外を使わない過去の資産との相性が悪いからと聞いている

211:デフォルトの名無しさん
10/04/25 15:30:48
>>208
まじかよ
boostやSTLを廃止したら生産性が下がるだろ。

Googleの躍進を見ていると、それを感じさせないほどの
Google独自ライブラリがあるのだろうかね。


212:デフォルトの名無しさん
10/04/25 15:32:01
全部例外じゃなくエラー返すようにした
完成度の高いライブラリでも持ってんじゃない

213:211
10/04/25 15:46:11
>>212
でも結構オープンソース開発をしているよな。
そのライブラリの一部も公開しているのだろうか。


214:デフォルトの名無しさん
10/04/25 15:52:57
>>209
> 例外禁止って、さらに new が禁止で2段階初期化が強制になるんだろ?
なるほど。
newは当然のごとく禁止ってのはわかる。
さらにConstructorで失敗した時に例外禁止だとどうしようもないから
init()
メンバを用意する訳か。

ほー。


215:デフォルトの名無しさん
10/04/25 15:59:18
デストラクタはあるからCの時ほどはつらい制限ではないけどね

216:デフォルトの名無しさん
10/04/25 16:02:05
initメンバなくてもis_valid的なメソッド有ればええんちゃうの?

217:デフォルトの名無しさん
10/04/25 16:10:44
valid であると判定できないといけないのは面倒くさい気がする
初期化済みフラグをいちいち導入する必要があったりとか

218:デフォルトの名無しさん
10/04/25 16:13:27
>>216
まぁね。

new(nothrow) した後 valid じゃない場合は即座に delete するファクトリメソッドを
用意すれば使う側の負担にもならない。これが害の最も少ない対処法だと思う。

例外使ったほうがずっと良いんだけどね。

219:デフォルトの名無しさん
10/04/25 16:23:18
可変個引数テンプレートがないと根本的な解決には

220:デフォルトの名無しさん
10/04/25 16:31:19
>>219
なんのこっちゃ?

221:デフォルトの名無しさん
10/04/25 16:32:59
>>217
逆に言えばbool メンバが一つ必要になる反面、
いかなる状況でもis_validを呼び出せば初期化済みかどうか
確認できるってメリットにもなるよな。

init()で初期化する方式だとそれはできない。

でも例外を使うべきだと俺は思うけどね。

222:デフォルトの名無しさん
10/04/25 16:36:52
まあ、初期化済みフラグがちゃんと管理されてればな

223:デフォルトの名無しさん
10/04/25 16:46:54
>>222
>ちゃんと管理されてればな
そんな手間じゃないでしょ。

メンバの
 bool 初期化済みflag;
をConstructorでfalseに設定して、initでtrueにするように設定して、
他のメンバからはいじれないようにすれば大丈夫さ。


224:デフォルトの名無しさん
10/04/25 16:54:59
復旧不能なエラーが起きた場合どうするかとか

225:223
10/04/25 16:57:39
> 他のメンバからはいじれないようにすれば大丈夫さ。
自分で言っててそれはつまりどうする気だと思ってきた。

初期化済み flag をメンバに持つそのためだけの基底クラス class InitFlagImpl を用意して
InitFlagImpl 中で派生クラスの init() を一個一個全て friend 指定する。
また InitFlagImpl の Default Constructor は初期化済み flag を false にセットするようにしておく。

そして派生クラスは InitFlagImpl を private 継承してやれば
派生クラスの Constructor では自動的に InitFlagImpl の Default Constructor が呼ばれるので
自動的に初期化済み flag が false にセットされ、
派生クラスの init() だけに気を配れば良い事になる。


>>224
それは初期化済みフラグには関係ない話だ。


226:デフォルトの名無しさん
10/04/25 16:59:26
オブジェクトが正常でない状態になったら
is_valid は false を返すべきだと思う

227:223
10/04/25 17:01:59
>>226
うむ。おっしゃるとおり。
だがそれは本質的な問題じゃないから解決は簡単だ。
上述の is_valid を is_初期化済み として読み替えてくれ。



228:デフォルトの名無しさん
10/04/25 17:07:23
復旧不能な状態って初期化済みと自信を持って言えるかね
まあコンストラクタのエラーに対してのみ使う、という規約を周知するのなら

229:デフォルトの名無しさん
10/04/25 17:13:15
flagの中身が破壊されるようなエラーが出たらダメだから
ちゃんとチェックメソッド書いた方がいいよね

230:デフォルトの名無しさん
10/04/25 17:17:37
メモリ破壊気にするなら
flagの前後にメモリとって
そこが破壊されてるかチェックしたのでいいと思うの

231:デフォルトの名無しさん
10/04/25 17:17:49
>>228
bool is_初期化済み()

bool is_valid()
があれば自信を持って言っていいと思うぜ。

>>229
>>225方式ならflagは破壊されないんじゃね?


232:デフォルトの名無しさん
10/04/25 17:18:08
めんどくせー。例外投げりゃいいじゃねーか。
Google みたいな事情がおまいらのところでもあるのか?

233:デフォルトの名無しさん
10/04/25 17:19:46
おい議論がおかしくなって居るぞ。

今は
1.「例外を禁止したが故に生じる問題点とその解決策」
について論じているんじゃないのか?
なのに不法なメモリー破壊の話とか、
2.「例外を禁止していようがいまいが生じる問題点」
じゃないか。

1.と2.を混同してないかい?みんな。



234:デフォルトの名無しさん
10/04/25 22:52:23
かわいい映画を見に行こうと思って「テディ」を選んでしまったときの気持ち

235:デフォルトの名無しさん
10/04/25 23:19:53
AMD製 CPUを搭載しているPCでコンパイルしたEXEが
Intel製 CPUを搭載しているPCでなぜ動作するのですか?

コンパイラはネイティブコードを出力するとすると、動作しないのでは?

236:デフォルトの名無しさん
10/04/25 23:23:45
>>235
動作するように互換性を持たせてるからです。
Wikipedia項目リンク
Wikipedia項目リンク


237:デフォルトの名無しさん
10/04/25 23:25:00
もちろん、IntelやAMDの独自拡張命令を使ってると
ほかのCPUでは動かなくなる

238:デフォルトの名無しさん
10/04/26 01:06:47
ファンクタって何が便利なんですか?

239:デフォルトの名無しさん
10/04/26 01:14:59
関数ポインタと比べると最適化されやすいあたり

240:デフォルトの名無しさん
10/04/26 01:19:55
単に一時オブジェクトの関数呼んでるだけじゃなかったんですね


241:デフォルトの名無しさん
10/04/26 02:10:12
何も便利とは思わんが・・・

242:デフォルトの名無しさん
10/04/26 02:13:02
boost::function使い倒してからもう一度出直してこい

243:デフォルトの名無しさん
10/04/26 02:43:51
>>242
今使い倒してみました
高が知れてますね

244:デフォルトの名無しさん
10/04/26 02:50:19
私が知りたいのは、ファンクタは無理に使う必要は無いか?ということです

245:デフォルトの名無しさん
10/04/26 02:57:44
C++に慣れてくれば自然と使いたくなるので、無理に使う必要は無いです。

246:デフォルトの名無しさん
10/04/26 06:25:02
>>235
下手にある側が、上手にある側にいやいやでも合わせて互換性を持たせる
なんてことは良くある話だ。


247:デフォルトの名無しさん
10/04/26 06:26:30
>>244
> 私が知りたいのは、ファンクタは無理に使う必要は無いか?ということです
無理に使う必要は無い。
だが使わない方が無理とは言わないまでも、不便だし
デザパタ上もまずいと思いませんか



248:デフォルトの名無しさん
10/04/26 06:49:06
面白いやり取りを発見しました。

URLリンク(rararahp.cool.ne.jp)

249:デフォルトの名無しさん
10/04/26 08:23:04
レベルの高い方々はその程度のことでもカリカリして大変そうだな

250:デフォルトの名無しさん
10/04/26 08:34:55
レベルが高いとかの問題じゃないでしょ。
見本となる人がこの程度の事で手を抜いてどうするの?

251:デフォルトの名無しさん
10/04/26 08:39:38
いやこれは手を抜いていいだろ

252:デフォルトの名無しさん
10/04/26 08:41:30
日付見てスルーしろよ

253:デフォルトの名無しさん
10/04/26 08:54:16
プログラマって知的でいつも冷静沈着な人種と思ってたけど、案外沸点低いよね

254:デフォルトの名無しさん
10/04/26 11:54:35
下記のように配列をまとめて代入したいのですが、良いアイディアはないですか?
char value[] = {1,2,3,4};
vallue = {5,6,7,8};

255:デフォルトの名無しさん
10/04/26 12:02:20
>>254
static char const next_value[] = {5,6,7,8};
std::copy(next_value, next_value + 4, value);

さぁ不満なところを列挙してもらおうか?

256:デフォルトの名無しさん
10/04/26 12:14:44
freadって

257:デフォルトの名無しさん
10/04/26 12:44:56
>>256
std::fread()のことならC標準関数のそれと同じものです。
つまり、ストリームから指定バイト数の要素を指定個数読み取る関数ですね。

258:デフォルトの名無しさん
10/04/26 12:55:02
enumしてもらおうか

259:デフォルトの名無しさん
10/04/26 13:42:35
>>225の方式って読んでみたらかなり綺麗に見えるけど、
コンパイル通るんかいな。


260:デフォルトの名無しさん
10/04/26 15:04:06
デストラクタの挙動で質問です。

すべて純粋仮想関数のメソッドを持つクラスを基底として、
継承したクラスをdeleteした際、デストラクタが呼ばれないようです。

テストは下記のように作りました。

class ITest {
public : virtual ~ITest(){};
public : virtual void Print() = 0;
};

class TestOne : public ITest {
private : char* str;

public : TestOne( char* str_ ){
str = str_;
};

public : virtual ~TestOne(){
printf( str );
str = NULL;
};

public : virtual void Print() {
printf( "ONE " );
printf( str );
};
};


261:デフォルトの名無しさん
10/04/26 15:04:53
class TestTwo : public TestOne {
private : char* str;

public : TestTwo( char* str1_, char* str2_ ) : TestOne( str1_ ){
str = str2_;
}

public : virtual ~TestTwo(){
printf( str );
str = NULL;
}

public : virtual void Print() {
printf( "TWO " );
printf( str );
}
};

int _tmain( int argc, _TCHAR* argv[] ){
TestTwo* _two = new TestTwo( "1111","2222" );
TestOne* _one = _two;
ITest* _ites = _two;

_two->Print();
_one->Print();
_ites->Print();

delete _ites;

return 0;
}


262:デフォルトの名無しさん
10/04/26 15:06:56
_itesをdeleteした際に、PrintTwo、PrintOneの順でデストラクタが
呼ばれることを期待しましたが、呼ばれないようです。

コンパイラはVC++2008でPSはXPのSP3です。

_oneや_twoをdeleteした場合は、
期待したとおりにデストラクタが呼ばれております。

この挙動はC++の仕様なのでしょうか?


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

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