C++相談室 part54
■ このスレッドは過去ログ倉庫に格納されています
0001v(^・^)v
2006/10/30(月) 22:34:08ただし質問の前にはFAQに一通り目を通してください。
IDE(VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
テンプレその他 >>2-15 付近参照
前スレ
C++相談室 part53
http://pc8.2ch.net/test/read.cgi/tech/1159340181/
0232デフォルトの名無しさん
2006/11/06(月) 16:13:57for_each()って事?
添え字がわかっているならoperator[]でアクセスできるけど
0233デフォルトの名無しさん
2006/11/06(月) 16:17:03lower_bound()も使える。
0234デフォルトの名無しさん
2006/11/06(月) 16:41:44template< class T, typename V > struct my_predicate
: public binary_function< T, V, bool > {
bool operator()( T const & t, V v ) const {
/* TODO:比較処理 */
}
};
...
vector<T> vt;
vector<T>::iterator it = find_if( vt.begin(), vt.end(), bind2nd(my_predicate<T,int>(),1) );
0235デフォルトの名無しさん
2006/11/06(月) 16:45:27出力したいのですがそのようなプログラムになるのでしょうか?よろしくお願いします。
0236デフォルトの名無しさん
2006/11/06(月) 16:47:56質問が抽象的すぎ
ある値がどこにあるのかとか。
それ以前に丸投げってやつは(ry
0237デフォルトの名無しさん
2006/11/06(月) 16:53:08たとえばある一次式のxの値に1.2.5.10.20.50.100.200・・・・と順にその答えを出したいのですが、
1.2.5.10.20.50.100.200・・・・をどうやって出力するのかってことかな?
0238デフォルトの名無しさん
2006/11/06(月) 16:54:250239デフォルトの名無しさん
2006/11/06(月) 17:06:330240デフォルトの名無しさん
2006/11/06(月) 17:10:390241デフォルトの名無しさん
2006/11/06(月) 17:13:030242デフォルトの名無しさん
2006/11/06(月) 17:15:240243デフォルトの名無しさん
2006/11/06(月) 17:25:51#include <stdio.h>
void main(void){
int x[] = {1, 2, 5};
int i;
for(i = 1; 1; i *= 10)
printf("%d.%d.%d.", x[0]*i, x[1]*i, x[2]*i);
}
0244デフォルトの名無しさん
2006/11/06(月) 18:43:29{
c(){cout << "c ctor" << endl ;}
//c( const c &obj ){cout << "c copy ctor" << endl ;}
~c(){cout << "c dtor" << endl ;}
} ;
c func( c obj )
{
cout << "func" << endl ;
return (obj) ;
}
で
func( c() ) ;
と実行すると
c ctor
func
c dtor
c dtor
c dtor
//をとってコピーコンストラクタを実装すると
c ctor
func
c copy ctor
c dtor
c dtor
コピーコンストラクタの定義の有無で
デストラクタの呼び出し回数が変わるものなのでしょうか?
0245デフォルトの名無しさん
2006/11/06(月) 18:53:08きちんとした実験結果があるのになぜ質問しているのか不明ですが、
現に変わってるでしょう?
なぜこういう動作になるかは、コピーコンストラクタがある場合と無い場合とで
引数(と戻り値)の受け渡しがどう変わるかを調べればわかると思います。
0246デフォルトの名無しさん
2006/11/06(月) 19:00:08printf("%d.%d.%d.", x[0]*=10, x[1]*=10,x[2]*=10);
}
のほうがよくね?
0247デフォルトの名無しさん
2006/11/06(月) 19:48:05コンパイラはコピーを最適化して除去できるので
変わっても不思議ではない。実際、GCCではどちらも2回だった
0248デフォルトの名無しさん
2006/11/06(月) 21:10:23"Move Semantics"
という単語がでてくるんですが、コレは
std::auto_ptrの様にオブジェクトの所有権が移動する
事を指している
という認識でいいんですか?
0249デフォルトの名無しさん
2006/11/06(月) 21:13:57文脈にもよるけど、たぶんC++0xの機能のこと。
その機能の目的はauto_ptrのような所有権の移動を楽に記述するような機能と思えば大体OK
0250デフォルトの名無しさん
2006/11/06(月) 21:25:54ありがとうございます。
具体的にどういう仕組みかわからないので、ググってきます
0251デフォルトの名無しさん
2006/11/06(月) 22:32:39それ、コンパイラ何使ってる?
コピーコンストラクタをユーザー定義するかどうかで
一時オブジェクトの有無が変わる理由がわからん。
0252244
2006/11/07(火) 01:04:15変わってるんですが、なぜかわからなかったもので。
引数と戻り値の受け渡し時のコピーがらみかなとも思ったんですが
調べてもわからなかったもんで。
デストラクタが3回呼ばれるのが謎で
コピーコンストラクタの呼び出しをチェックしようとしたら
デストラクタが2回しか呼ばれなくなってわからなくなりました…
>>247
GCCではどちらも2回なんですね。コンパイラ依存?
VS2005 C++を使ってるんですが、デバッグ用なので
最適化オプションは無効になってますが、
その最適化とは違うことだとすると
ユーザ定義のコピーコンストラクタがない場合のみ
一時オブジェクトが2個作られてるって事でしょうか。調べてみます。
>>251
VS2005 C++です。
私もその理由がわからなくて悩んでます。
>>247 の最適化による除去が濃厚そうですね。
0253デフォルトの名無しさん
2006/11/07(火) 01:23:19B = a | bc
みたなBNFをtemplate使って書いてみたいんですけどどうやって書けばいいの?
0254デフォルトの名無しさん
2006/11/07(火) 01:45:090255デフォルトの名無しさん
2006/11/07(火) 02:04:10つ[Boost.Spirit]
0256デフォルトの名無しさん
2006/11/07(火) 02:04:34ユーザー定義のデストラクタはあり、
ユーザー定義のコピーコンストラクタはない
バランスが取れてないのでVC++は除去しないと見た
ベンダに聞かないと分からんけどなw
0257デフォルトの名無しさん
2006/11/07(火) 02:18:36っていうコンテナ作りました。
これだと、Aを丸々コピーしなくても問題ないですよね?
あと格納したオブジェクトをoperator()を実装して呼び出せば
関数呼び出しのコストはかからないですよね?
0258デフォルトの名無しさん
2006/11/07(火) 02:29:13sizeof(A *)のコピーしか無いだろうが、ポインタの参照先については責任を持たなきゃならんな。
>あと格納したオブジェクトをoperator()を実装して呼び出せば
A::operator () () であろうが、void A::func()であろうが、所詮は同じ「関数」。
0259デフォルトの名無しさん
2006/11/07(火) 10:02:19ttp://p-stade.sourceforge.net/biscuit/index.html
typedef seq<
chseq<'/','*'>,
star_until< any, chseq<'*','/'> >
> c_comment;
std::string text("/* Hello, Biscuit! */");
if (biscuit::match<c_comment>(text)) {
//...
}
0260デフォルトの名無しさん
2006/11/07(火) 10:29:34News 2006-11-06: C++ Standard Core Language Issues List (Revision 44) is available
0261244
2006/11/07(火) 15:23:23ユーザ定義コピーコンストラクタありだと
c obj = c() ;
ユーザ定義コピーコンストラクタなしだと
c tmp = c() ; c obj = c ;
となるみたいです。
DEBUG版だから最適化無効になっているはずなんですけどね。
コンパイラの最適化の話ではなく、C++の言語仕様なんだろうか。
--
struct c
{
c(){ cout << "c ctor" << endl ; }
//c( const c &obj ){cout << "c copy ctor" << endl ;}
~c(){ cout << "c dtor" << endl ;}
} ;
void func2( c obj ) {cout << "func2" << endl ; }
で、以下をユーザ定義コピーコンストラクタあり/なしで実行すると、
func2( c() ) ;
ユーザ定義コピーコンストラクタあり
c ctor
func2
c dtor
ユーザ定義コピーコンストラクタあり
c ctor
func2
c dtor
c dtor
0262デフォルトの名無しさん
2006/11/07(火) 16:08:460263262
2006/11/07(火) 16:09:180264デフォルトの名無しさん
2006/11/07(火) 16:13:26template< Any>//??
Any detAnyFromIndex(int index)
{
if(index==0)
return( (char)(... ) )
if(index==1)
return( (int)(... ) )
if(index==2)
return( (double)(... ) )
}
0265デフォルトの名無しさん
2006/11/07(火) 16:45:52templateをなんだと思ってるんだ?
最近template関係の質問多くなったな
それもアホみたいなのが。
流行ってんの?
0266264
2006/11/07(火) 17:04:54関数の返す方を動的に変えたい
boost::any detAnyFromIndex(int index)
だと、データを取り出すときに結局
boost::any_cast<float>(output )
が必要になって処理が後回しにされるだけで解決にならない
0267デフォルトの名無しさん
2006/11/07(火) 17:14:170268デフォルトの名無しさん
2006/11/07(火) 17:32:39型は静的なものだから、動的に取得することは出来ません。
0269デフォルトの名無しさん
2006/11/07(火) 17:39:080270デフォルトの名無しさん
2006/11/07(火) 17:55:020271デフォルトの名無しさん
2006/11/07(火) 17:55:20その自身たっぷりんりんの発言はどこから来るんだ?
さっさとしね
0272デフォルトの名無しさん
2006/11/07(火) 18:00:22やりたいことを明確に汁
0273デフォルトの名無しさん
2006/11/07(火) 18:06:21できません。
0275デフォルトの名無しさん
2006/11/07(火) 18:10:10できません。
0276デフォルトの名無しさん
2006/11/07(火) 18:13:04できないっつってんだろうがボケww
プリプロセッサとか・・w
もう一度template勉強しろ
0277264
2006/11/07(火) 18:14:27boostのHPにあったサンプルで解決できそうです
#define ARITHMETIC_TYPE(I) ARITHMETIC_TYPE ## I
#define ARITHMETIC_TYPE0 bool
#define ARITHMETIC_TYPE1 char
#define ARITHMETIC_TYPE2 signed char
#define ARITHMETIC_TYPE3 unsigned char
#define ARITHMETIC_TYPE4 short
#define ARITHMETIC_TYPE5 unsigned short
#define ARITHMETIC_TYPE6 int
#define ARITHMETIC_TYPE7 unsigned int
#define ARITHMETIC_TYPE8 long
#define ARITHMETIC_TYPE9 unsigned long
#define ARITHMETIC_TYPE10 float
#define ARITHMETIC_TYPE11 double
#define ARITHMETIC_TYPE12 long double
0278デフォルトの名無しさん
2006/11/07(火) 18:16:05できません。
0279デフォルトの名無しさん
2006/11/07(火) 18:16:25boost使っても出来ません><;;;;
どうすればできますか???
プリプロセッサ使えばできるんですか><
0280デフォルトの名無しさん
2006/11/07(火) 18:17:11やりたいことは分かったしそれが最適だと思うなら勝手にしろ
0282デフォルトの名無しさん
2006/11/07(火) 18:19:24マクロはコンパイル時に展開されますから、動的な処理は行えません。
相談室で相談に対して正解教えてるのにその口ぶり・・・酷ス
0283デフォルトの名無しさん
2006/11/07(火) 18:23:350284デフォルトの名無しさん
2006/11/07(火) 18:23:55具体的な例がでてないから、やきもきするのはわかるが、
その態度は気にくわんな
学生さん?
0286デフォルトの名無しさん
2006/11/07(火) 18:28:420287デフォルトの名無しさん
2006/11/07(火) 19:13:330288デフォルトの名無しさん
2006/11/07(火) 19:23:51リソース管理クラスの目的で関数ポインタをメンバにしようとしてるんですが、
呼び出し規約が違うと関数ポインタに代入できないようで困ってます。
(今は各規約のポインタとコンストラクタを持ってる)
呼び出し規約ってのはtemplateで決定できないんでしょうか?
#include <windows.h>
template <typename T, typename R = void>
class AutoResource {
T resource;
R (/*WINAPIV*/WINAPI *killFunc)(T);
// ↑ここをtempleateに
public:
AutoResource(T res, R (/*WINAPIV*/WINAPI *func)(T) ) : resource(res), killFunc(func) {}
~AutoResource() { (this->killFunc)(this->resource); }
};
void f(HMODULE h) { FreeLibrary(h); }
int main() {
AutoResource<HMODULE, BOOL> res(LoadLibrary(TEXT("freetype.dll")), FreeLibrary);
//AutoResource<HMODULE> ress(LoadLibrary(TEXT("shell32.dll")), f);
return 0;
}
コンパイラはVC8です
0289デフォルトの名無しさん
2006/11/07(火) 19:48:09template< typename T, typename R > struct killer_base
: public std::unary_function< T, R > {
virtual ~killer_base() {};
virtual R operator()( T ) = 0;
};
template< typename F, typename T, typename R > struct killer
: public killer_base<T,R> {
F f;
killer( F func ) : f(func) {}
R operator()( T t ) { return f(t); }
};
template <typename T, typename R = void>
class AutoResource {
T resource;
auto_ptr< killer_base<T,R> > const killFunc; // noncopyable
public:
template< typename KillerFunc >
AutoResource(T res, KillerFunc func )
: resource(res), killFunc(new killer<KillerFunc,T,R>(func)) {}
~AutoResource() { (*killFunc)(resource); }
};
0290デフォルトの名無しさん
2006/11/07(火) 19:49:37boost::function
0291デフォルトの名無しさん
2006/11/07(火) 20:03:57>>289のkiller_baseって何で必要なの?
0292デフォルトの名無しさん
2006/11/07(火) 20:22:530293デフォルトの名無しさん
2006/11/07(火) 20:28:46boost::shared_ptr の sp_counted_base と、sp_counted_impl みたいなもの。
コンストラクタ呼び出しで渡された型を保存しておくための方法。
0294デフォルトの名無しさん
2006/11/07(火) 20:41:12(゚д゚)スゲー とりあえず意図したとおりのものになりました
ありがとうございます
内容はまだ理解できてないけどな!
0295デフォルトの名無しさん
2006/11/07(火) 21:19:13人格障害の診断をうけたほうがいいぞ
0296デフォルトの名無しさん
2006/11/07(火) 22:19:59すまん。
まったくわからん。
0297デフォルトの名無しさん
2006/11/07(火) 22:46:18ああすることによって、killer<F, T, R>型(のうち具体的にはF)がなんであっても
統一的に基底クラスであるkiller_base<T, R>型のオブジェクトとして取り扱えるようになる。
boost::functionなんかも同じようなことをやっている。
0298デフォルトの名無しさん
2006/11/07(火) 23:01:36理解した。ありがつ。
0299デフォルトの名無しさん
2006/11/07(火) 23:47:53#include <limits.h>
int _tmain(int argc, _TCHAR* argv[])
{
int n,max=INT_MIN,min=INT_MAX;
bool flag=true;
do{
printf("整数を入力してください。");
scanf_s("%d",&n);
if(n==0) flag=false;
if(n>max) max=n;
else if(n<min) min=n;
}while(flag);
printf_s("\n最大は%d 最小は%dです。\n",max,min);
return 0;
}
VC++ Proでこれを実行すると0を入力したとき
コマンドプロント閉じちゃうんですがどうしたらいいんですか
0300299
2006/11/07(火) 23:51:010301デフォルトの名無しさん
2006/11/07(火) 23:54:46ありがとう、おめでとう。
0302デフォルトの名無しさん
2006/11/08(水) 00:03:32意味不明。関数ポインタでいいじゃん
0303デフォルトの名無しさん
2006/11/08(水) 00:24:230304デフォルトの名無しさん
2006/11/08(水) 00:25:310305デフォルトの名無しさん
2006/11/08(水) 00:31:13だんだんチラシの裏っぽくなってきた。
0306デフォルトの名無しさん
2006/11/08(水) 00:34:19D&Eには、理由がない限りどの演算子も多重定義できるようにしたというようなことが書いてある。
そもそも導入された理由はその流れだろう。
>>304
Windows APIのコールバック関数ではそういう風になっているな。
だが、operator ()を使って(というよりboost::bindなんかで束縛してやって)のほうが、スマートだと俺は思う。
STLを考えた偉い人もたぶんそんなことを考えたのだろう。
0307デフォルトの名無しさん
2006/11/08(水) 00:35:190308デフォルトの名無しさん
2006/11/08(水) 00:37:450309デフォルトの名無しさん
2006/11/08(水) 00:40:02tmplateでどうやって渡すの?
サンプル教えて
0310デフォルトの名無しさん
2006/11/08(水) 00:50:37void call_funcobj(FUNC f)
{
f("hello,world") ;
}
void func(std::string const & message)
{ std::cout << message << std::endl ; } ;
class FuncObj
{
std::string header_ ;
public :
FuncObj(std::string const & header) : header_(header) { }
void operator() (std::string const & message)
{ std::cout << header_ << message << std::endl ; }
} ;
int main()
{
call_funcobj(func) ;
FuncObj f1("message : "), f2("メッセージ:") ;
call_funcobj(f1) ;
call_funcobj(f2) ;
}
0311デフォルトの名無しさん
2006/11/08(水) 01:07:07class Window
{
// ...
public:
void SetTitle(const std::string&);
// ...
};
void f()
{
Window w;
call_funcobj(boost::bind(&Window::SetTitle, w, _1));
}
0312デフォルトの名無しさん
2006/11/08(水) 02:59:48News 2006-11-07: The 2006-09 mailing is available
Working Draft の新しい奴 n2134.pdf がうpされてる。
0313デフォルトの名無しさん
2006/11/08(水) 03:45:37ttp://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/kasumi/kasumi2/
0314デフォルトの名無しさん
2006/11/08(水) 05:02:17つ[iconv]
0315デフォルトの名無しさん
2006/11/08(水) 13:40:34関数ポインタより効率がよくなるから
0316デフォルトの名無しさん
2006/11/08(水) 18:59:29どなたかお教えいただけないでしょうか
struct sttest
{
typedef int myint;
};
typedef sttest * psttest;
typedef psttest->myint mymyint;
こんな感じのtypedefをしたいのですが構文エラーe2143などとなって
コンパイルできません
0317デフォルトの名無しさん
2006/11/08(水) 19:11:52何がしたいんだ?
typedefは型を定義するものだよ
0318デフォルトの名無しさん
2006/11/08(水) 19:16:24こういうことがやりたいのかな?
0319316
2006/11/08(水) 19:16:52psttestしか受け取れないclassの中でstruct sttest で定義した
ypedefの情報をうけとりたいのです
template<typename Ptr = psttest>
class MyClass
{
typedef Ptr::myint mymyint;
};
0320デフォルトの名無しさん
2006/11/08(水) 19:17:22typedef sttest::myint mymyint
がしたいんじゃないかと感じた。
0321316
2006/11/08(水) 19:32:45ポインターが持ってるtypedefの情報を渡すことができなくなって
しまったので、なんとか解決したい。というのがやりたいことです。
0322デフォルトの名無しさん
2006/11/08(水) 19:38:51ポインタがtypedefの情報もってるって…何か壮大に勘違いしてないか?
0323デフォルトの名無しさん
2006/11/08(水) 19:49:41typedef a+b c と同じような事だと思った。
0324デフォルトの名無しさん
2006/11/08(水) 20:02:22{ typedef typename T::myint type; };
template<typename T> struct RemovePointer<T*>
{ typedef typename T::myint type; };
typedef RemovePointer<psttest>::type mymyint;
0325デフォルトの名無しさん
2006/11/08(水) 20:08:530327デフォルトの名無しさん
2006/11/08(水) 20:53:06vectorに値を格納していって、
for(int i = 0; i < n; i++){
for(int j = 0; j < x; j++)
cout << (*v[i])[j] << endl;
}
で表示するんですけど、
(*v[i])[j] ってどういう意味なんでしょうか?
不勉強で申し訳ないのですが、ご教授をお願いできないでしょうか?
0328デフォルトの名無しさん
2006/11/08(水) 20:56:19v の i 番目 (0から数える。以下も同様) に入っているポインタが指す先にある
vector<double>型のインスタンスの、j番目の要素への参照。
0329デフォルトの名無しさん
2006/11/08(水) 20:57:57おかしくないか?
*v[i][j]だと思うが。
0330デフォルトの名無しさん
2006/11/08(水) 20:59:54vector<double*>と勘違いしてた。
0331デフォルトの名無しさん
2006/11/08(水) 21:02:34ありがとうございます!
助かりました!
>>329
参考書をそのまま写したんですが、
おっしゃる通りにやってみたところ、
エラーになりました。
■ このスレッドは過去ログ倉庫に格納されています