[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 05/09 22:57 / Filesize : 262 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【C++】template 統合スレ -- Part6



1 名前:デフォルトの名無しさん mailto:sage [04/11/25 21:11:32]
C++ のジェネリックプログラミングの話をしましょう。
以下のスレッドを統合するスレです。
STLスレッド
Part1 pc.2ch.net/tech/kako/1004/10042/1004287394.html
Part2 pc3.2ch.net/tech/kako/1026/10267/1026793823.html

【C++】Boost使い集まれ!
pc3.2ch.net/test/read.cgi/tech/1033830935/ (html化待ち?)

Generic Programming with C++ Template
pc.2ch.net/tech/kako/1008/10085/1008593126.html
【C++】template 統合スレ -- STL/Boost/Loki, etc.
pc2.2ch.net/tech/kako/1037/10377/1037795348.html
【C++】template 統合スレ -- Part2
pc2.2ch.net/test/read.cgi/tech/1047978546/ (html化待ち)
【C++】template 統合スレ -- Part3
pc5.2ch.net/test/read.cgi/tech/1066493064/ (html化待ち)
【C++】template 統合スレ -- Part4
pc5.2ch.net/test/read.cgi/tech/1083550483/ (html化待ち)
【C++】template 統合スレ -- Part5
pc5.2ch.net/test/read.cgi/tech/1091522597/
関連スレ、その他リンクは >>2-5 あたりに。


929 名前:デフォルトの名無しさん [2005/09/14(水) 15:45:52 ]
template< typename char_type, tepename char_traits >
std::basic_ostream< char_type, char_traits >& operator<< ( std::basic_ostream< char_type, char_traits >& stream, const int& value )
{
stream << "value = " << value << endl;
return stream;
}

この関数内で文字列リテラル"value = "を
char_type がcharなら、"value = "
char_type がwcharなら、L"value = "
にしたいんですが、どうしたら良いでしょうか?

930 名前:デフォルトの名無しさん mailto:sage [2005/09/14(水) 16:12:57 ]
>>929
テンプレートの特殊化か、オーバーライドで解決させる。

ex)
inline char const * choice( char const * s, wchar_t const *, char )
{
 return s;
}
inline wchar_t const * choice( char const *, wchar_t const * s, wchar_t )
{
 return s;
}

stream << choice("value=",L"value=",char_type()) << value << endl;

931 名前:929 mailto:sage [2005/09/14(水) 16:31:48 ]
>>930
#define literal_str( char_type, str ) choice( str, L##str, char_type##() )
付きで採用しますた。
ありがとうございました。

932 名前:デフォルトの名無しさん mailto:sage [2005/09/14(水) 17:21:04 ]
>>931
二番目の##は余計。

933 名前:929 mailto:sage [2005/09/14(水) 21:31:05 ]
だからなんだよこのタコ助!

934 名前:デフォルトの名無しさん mailto:sage [2005/09/14(水) 22:41:20 ]
確かに余計だな。

935 名前:929 mailto:sage [2005/09/15(木) 00:04:09 ]
>>933
>>929の著作権は私にあります。
なんなら出るとこ出ても・・
と思いましたがきっと>>933
私にインスパイヤされて誕生した新種なんでしょう。
今回はかんべんしてやります。

936 名前:デフォルトの名無しさん mailto:sage [2005/09/15(木) 11:53:02 ]
template <class T>
void f1(T t)
{
 f2(t);
}

void f2(int) {}

int main()
{
 f1(1);
}

というコードは正しいのでしょうか?

VC7.1 ではコンパイル可能で comeau ではコンパイルできません。

937 名前:デフォルトの名無しさん mailto:sage [2005/09/15(木) 12:50:56 ]
>>936
comeauだとなんてエラーが出るの?




938 名前:636 mailto:sage [2005/09/15(木) 13:09:16 ]
>>637
identifier "f2" is undefined
detected during instantiation of "void f1(T) [with T=int]"

というエラーです。strict mode のみのようです。

ちなみに、ユーザ定義型の場合は期待通りにコンパイルできました。

template <class T>
void f1(T t)
{
 f2(t);
}

struct a{};
void f2(a) {}

namespace adl
{
 struct a{};
 void f2(a) {}
}

int main()
{
 f1(a());
 f1(adl::a());
}

このコードはコンパイル成功。

939 名前:デフォルトの名無しさん mailto:sage [2005/09/15(木) 14:23:18 ]
>>936
gcc3.4.4(MinGW) で、-Wallで通る。

940 名前:デフォルトの名無しさん mailto:sage [2005/09/15(木) 14:26:00 ]
>>938
プロトタイプ宣言したら?

941 名前:デフォルトの名無しさん mailto:sage [2005/09/15(木) 14:31:54 ]
>>938
f2()のプロトタイプ宣言が必要っぽい。

942 名前:デフォルトの名無しさん mailto:sage [2005/09/15(木) 16:28:36 ]
Incompatibilities Between ISO C and ISO C++, David R. Tribble

david.tribble.com/text/cdiffs.htm#C90-impl-func
・ Implicit function declarations

> C++ does not allow implicit function declarations. It is invalid to call a function
> that does not have a previous declaration in scope.
>
> C99 no longer allows functions to be implicitly declared.
> The code above is invalid in both C99 and C++.


943 名前:デフォルトの名無しさん mailto:sage [2005/09/15(木) 17:47:26 ]
>>936
標準の (14.6.4.2/1) をそのまま読む限りでは, unqualified name lookup として
解決される名前は point of definition の文脈のみが考慮されて,
associated namespaces を用いた名前解決(要するにADL)では,point of definitionと
point of instantiation の双方の文脈が考慮されるみたいですね.なので,

>>936 の f1(1) という呼び出しにおける f1 中の f2(t) に対する名前解決の場合,
unqualified name lookup では f2 の呼び出しを定義している場所(point of definition)
からは f2 という名前は解決されないので失敗し,さらに f2(t) は int を引数とした
呼び出しのために associated sets of namespaces and classes も空 (3.4.2/2) の
ため,ADL 経由でも f2 は見つからずに,結果 f2(t) という関数呼び出しに対応する
名前の解決が失敗する.

一方で,>>938 の f1(a()) 及び f1(adl::a()) という呼び出しにおける f1 中の f2(t)
に対する名前解決の場合,>>936 と同様 unqualified name lookup による名前解決は
失敗する.ところが,a 及び adl::a はユーザ定義型で,各々グローバルと adl が
associated namespace になる.この場合,f2(t) という呼び出しが定義されている
場所 (point of definition) と f1 がインスタンス化された場所
(point of instantiation) 双方の文脈が名前解決において考慮される.結果,
point of instantiation の文脈で void f2(a) と void adl::f2(adl::a) が
visible のため,これらの名前解決が成功する.

と,こういう感じだと思います.ちなみに VC++7.1 の挙動は,dependent name だろうが
non-dependent name だろうが,ADL 経由だろうがなかろうが,全て
point of instantiation の文脈も考慮するという実装になっているための結果で,
これは標準に準拠した挙動ではないです.

944 名前:943 mailto:sage [2005/09/15(木) 17:49:27 ]
あ,すいません.長々と書きましたけれど結論としては,
936のコードは(標準に準拠していないという意味で)正しくないと思います.

945 名前:936 mailto:sage [2005/09/15(木) 22:07:49 ]
>>943
なるほど。
実体化の時点で名前の解決を行っても、
実体化の時点の文脈が考慮されるとは限らないんですね。

皆様、ありがとうございました。

946 名前:デフォルトの名無しさん mailto:sage [2005/09/15(木) 22:41:25 ]
template<class T>
class Foo {
 public:
    ...;
 private:
    class Bar { 
    public:
        ...;
        bool operator()(const Bar& l, const Bar&r) const;
    private:
        T m_value; 
        int misc_info;
    };
    
    std::multiset<Bar, Bar::Comp> m_bars;
};

m_bars の先頭・末尾に番人(misc_value などは他のメ
ンバと同様にアクセス可能にしたもの)を導入したいの
ですが、どういうアプローチで作れば良いでしょうか?


947 名前:デフォルトの名無しさん mailto:sage [2005/09/16(金) 01:33:46 ]
>>946 undeclared identifier `misc_value'



948 名前:デフォルトの名無しさん mailto:sage [2005/09/16(金) 09:43:59 ]
>>946
テンプレート関係ないやん。

949 名前:デフォルトの名無しさん mailto:sage [2005/09/18(日) 16:56:08 ]
STLportではコンパイルできるけれど、
g++のSTLではエラーが出てしまうようなコードってどんなものがあるでしょうか?
vectorやstringくらいしか使ってないんですが、コンパイルでエラーが出ます。。

950 名前:デフォルトの名無しさん mailto:sage [2005/09/18(日) 17:25:59 ]
エラーメッセージ書かん奴には答えない

951 名前:デフォルトの名無しさん mailto:sage [2005/09/18(日) 17:33:35 ]
>>949
氏ね!

952 名前:デフォルトの名無しさん mailto:age [2005/10/05(水) 16:55:29 ]
template<int num, int count> struct power{ enum { value = power<num, count-1>::value * num }; };
template<int num> struct power<num, 1>{ enum { value = num }; };
template<int num> struct power<num, 0>{ enum { value = 0 }; };
template<> struct power<0, 0>{ enum { value = 0 }; };
       ∋oノハヽo∈
         ( ´D`) <テンプレート ♪ で、計算♪計算♪  age♪ age♪
          (つ┳9
         (_)┃_)
          ━§━
            §
   ⌒ヽ〃⌒ヽ〃    
int main()
{ //2の8乗
cout << power<2, 8>::value << endl;
return 0;
}


953 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 18:45:40 ]
>template<int num> struct power<num, 0>{ enum { value = 0 }; };

それはどうかと思うぞ。

954 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 19:02:12 ]
template<int num> struct power<num, 0>{ enum { value = 1 };};

955 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 19:13:50 ]
<0,0>,<num,1>の特殊化は必要ないな

956 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 21:12:57 ]
むしろこうしてコンパイル時エラーにしろよ。
template<> struct power<0, 0>{};

957 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 21:24:22 ]
0^0って数学的にはどうなるの?



958 名前:ヽ(´ー`)ノ ◆.ogCuANUcE mailto:sage [2005/10/05(水) 22:22:38 ]
>>956
n^0 = 1


959 名前:ヽ(´ー`)ノ ◆.ogCuANUcE mailto:sage [2005/10/05(水) 22:23:20 ]
スマン。レス番間違えた orz

960 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 22:28:09 ]
>>957-958
一方で0 ^ n = 0となっているから問題になる。
ところで^と言えばXORの立場が。

961 名前:デフォルトの名無しさん mailto:sage [2005/10/06(木) 12:22:20 ]
VC6のtemplate関数ってバグある気がするんだけど...
template<typename T> void test();
引数無し呼んだときに解決できてないみたい...
template<typename T> void test(const T&);
みたいにすればオーバーロードで解決できるのか、大丈夫みたいなんだが...


962 名前:デフォルトの名無しさん mailto:sage [2005/10/06(木) 12:36:11 ]
いまどきそんな化石コンパイラに文句言われても…

963 名前:デフォルトの名無しさん mailto:sage [2005/10/06(木) 13:39:14 ]
化石以前にtemplateに関しては欠陥コンパイラですから・・・

964 名前:デフォルトの名無しさん mailto:sage [2005/10/06(木) 17:42:46 ]
そもそもC++コンパイラじゃないですから

965 名前:デフォルトの名無しさん mailto:sage [2005/10/06(木) 22:25:31 ]
少なくともANSI/ISO C++準拠とは言えないな。

966 名前:デフォルトの名無しさん mailto:sage [2005/10/07(金) 04:44:36 ]
じゃーVC7はどうですか?

967 名前:デフォルトの名無しさん mailto:sage [2005/10/07(金) 05:23:27 ]
7.1はかなりまとも。



968 名前:デフォルトの名無しさん mailto:sage [2005/10/07(金) 12:23:52 ]
7と7.1は全然違うぞ
7はかなり微妙

969 名前:デフォルトの名無しさん mailto:sage [2005/10/07(金) 13:11:10 ]
7はCStringにバグがあったね。STL周りもちょっと不安定なところがあった気もする。

970 名前:デフォルトの名無しさん mailto:sage [2005/10/07(金) 14:50:27 ]
7.1って具体的にclのどのバージョン?


Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
っての使ってるけど

971 名前:デフォルトの名無しさん mailto:sage [2005/10/07(金) 15:06:35 ]
VS.net(VC.net)2003か、VCTK2003のやつが7.1
13.10.3077なら7.1だな。VS.net2003の方のやつだろ。

972 名前:デフォルトの名無しさん mailto:sage [2005/10/14(金) 17:36:27 ]
codeguruに記事の投稿してみたがレビュー通んないとだめなんだね


973 名前:デフォルトの名無しさん [2005/10/18(火) 15:57:25 ]
age

974 名前:デフォルトの名無しさん mailto:sage [2005/10/26(水) 22:29:10 ]
人稲杉なので、バカネタを投下。
www.hakusi.com/up/src/up5538.zip.html

Boost.Lambda みたいに Expression Template を使った、引数に対して安全なフォーマットライブラリ。
Boost.Function や、Boost.Bind と組み合わせることが可能。
以前作成したものと違い、オマケ機能だが入力も可能で、ワイド文字にも対応。

ただ、 _ と % だらけで見た目がキモイ上に、実用性がイマイチ謎。
Expression Template の資料として。

// 出力
 string strA, strB;
 sprint( strA, "1 " % !_x[6] % "/" % _s, 10, "aaaa" ); // sprintf( str, "%#6x/%s", 10, "aaaa" ); みたいな。
 sprint( strB, "2 " % (!_x[6]*='0') % "/" %_s, 10, "aaaa" ); // sprintf( str, "%#06x", 10, "aaaa" ); みたいな。
 cout << strA << endl; // 1 0xa/aaaa と出力
 cout << strB << endl; // 2 0x000a/aaaa と出力
// 入力
 int xA, xB;
 string yA, yB;
 sscan( strA, "1 " % _ws % _x % "/" % _s, xA, yA ); // 空白部分はスキップさせる
 sscan( strB, "2 " % _x % "/" % _s[3], xB, yB ); // 文字列部分は3文字のみ取得
 // 出力
 print( cout, "xA = " % _d % "\nyA = " % _s % _endl, xA, yA );
 print( cout, "xB = " % _d % "\nyB = " % _s % _endl, xB, yB );
 // xA = 10
 // yA = aaaa
 // xB = 10
 // yB = aaa と出力

975 名前:デフォルトの名無しさん mailto:sage [2005/10/27(木) 00:15:14 ]
>>974
せっかくなので便乗しておきますね.将来の話なのでアレですけれど.

www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1603.pdf

976 名前:デフォルトの名無しさん mailto:sage [2005/10/29(土) 10:05:49 ]
難読コンテスト会場はここですか?

977 名前:デフォルトの名無しさん [2005/10/31(月) 13:08:43 ]
>>974
すげー--w
確かに scanf っぽいこと出来るし。

でも、Perl みたいで汚いな。使おうとは思わんけど。



978 名前:デフォルトの名無しさん mailto:sage [2005/10/31(月) 13:59:50 ]
>>974
マジキモス

979 名前:デフォルトの名無しさん mailto:sage [2005/11/02(水) 14:02:41 ]
>>974
良くこんなん書く気になるなあ。

980 名前:デフォルトの名無しさん mailto:sage [2005/11/02(水) 14:40:35 ]
>>975
boostな人達はあれば便利だけど、一般人的にはどうなのかなあ?

981 名前:デフォルトの名無しさん mailto:sage [2005/11/02(水) 16:19:39 ]
>>980
どの辺が便利なのか理解に苦しむ。

982 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 13:49:05 ]
>>980
型安全な printf, scanf というのが一番インパクトが大きいと思います.
後,lambda のような(擬似的な)可変長テンプレート引数を使ったライブラリの
コンパイル時メッセージが見やすくなるというのもあるかと.

>>981
Boost な人にとっては,これまでプリプロセッサなどで力技で実装していた
Function, Tuple, MPL, Lambda など多くのライブラリの実装が
非常に楽に見通しよく実装できるようになり,便利になると思います.

983 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 15:15:01 ]
>>982
コンパイルエラーなどたいして問題じゃないけどね。
それよりもデバッグの方が大変。

984 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 15:19:33 ]
変な拡張するより単にプリプロセッサを名前空間対応にすればいいだけちがうの?


985 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 15:30:42 ]
>>984
それじゃプリプロセッサにならないでしょ。

986 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 17:19:51 ]
え、C/C++のプリプロセッサってトークン理解してるはずなんだけどなあ。
商用じゃプリプロセスと同時に解析するのが主流だし。
テンプレート引数程度の局所的変更じゃ根本的解決にならないでしょ。

987 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 17:26:54 ]
名前空間を通常のものとプリプロセッサで共有しようとすると
泥沼になる気がする。(例えば
# define STD_BEGIN namespace std{
とか)
pp専用の名前空間ならwaveが実験的に対応している。



988 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 22:37:23 ]
プリプロセッサと言えば、C++/CLIでとんちきな拡張してるよ。
スペース区切りキーワードってやつ。
www.microsoft.com/japan/msdn/vs05/visualc/TransGuide.asp

989 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 00:29:44 ]
プリプロセッサと本体の間のフォーマットってANSIか何かで標準規格ある?
#132 "hogehote.h"
たいていはこんなの出るんだよね?

990 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 01:08:57 ]
次スレ立てて良いですか?

991 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 01:21:16 ]
C++相談室で十分だと思うんだ。

992 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 01:32:58 ]
ハゲドー
一年もかかってやっと1スレなペースだし

993 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 01:40:20 ]
>>983
> コンパイルエラーなどたいして問題じゃないけどね。

断言君さようなら


994 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 11:26:29 ]
断言君だって。なにその俺様用語w

オナニーマクロだらけの糞コード書いてる奴は
日本語にもそれが出るね。

995 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 12:12:24 ]
断言君 の検索結果 約 926,000 件中 1 - 10 件目 (0.27 秒)

996 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 12:25:58 ]
俺も>>983を支持する。
ランタイムエラーが恐ろしいのであって、
コンパイルエラーなどコンパイラとの対話交渉に過ぎない。

997 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 13:14:27 ]
てかさ、コンパイルエラーが出てたら、
そもそも実行ファイルはビルドされて無いんじゃないか?
ワーニングなら分かるけど。



998 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 13:49:38 ]
つぎスレ立てるかどうか迷っているんだが
このスレのタイトルをよく吟味したら

「統合」:いくつかの物を一つにまとめあわせること

このように辞書では出ている。
つーことは「STL相談室」も「BOOSTを語れ」も入らないよーな気がした。
それとも、ここのつぎスレが要らないのか?
そんな疑問を抱いてしまって、俺には次スレを立てる勇気がない。
さあ。次をたてる勇者はだれか。

999 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 13:53:56 ]
boostは微妙だがSTLスレもこのスレも必要なし
あっても混乱するだけ


1000 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 14:02:28 ]
STLを使うと実行ファイルのサイズが10倍になるから
スレは統合すべきだと思います。

1001 名前:1001 [Over 1000 Thread]
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<262KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef