【C++】template 統合 ..
929:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/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
05/09/14 16:31:48
>>930
#define literal_str( char_type, str ) choice( str, L##str, char_type##() )
付きで採用しますた。
ありがとうございました。
932:デフォルトの名無しさん
05/09/14 17:21:04
>>931
二番目の##は余計。
933:929
05/09/14 21:31:05
だからなんだよこのタコ助!
934:デフォルトの名無しさん
05/09/14 22:41:20
確かに余計だな。
935:929
05/09/15 00:04:09
>>933
>>929の著作権は私にあります。
なんなら出るとこ出ても・・
と思いましたがきっと>>933は
私にインスパイヤされて誕生した新種なんでしょう。
今回はかんべんしてやります。
936:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/09/15 12:50:56
>>936
comeauだとなんてエラーが出るの?
938:636
05/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:デフォルトの名無しさん
05/09/15 14:23:18
>>936
gcc3.4.4(MinGW) で、-Wallで通る。
940:デフォルトの名無しさん
05/09/15 14:26:00
>>938
プロトタイプ宣言したら?
941:デフォルトの名無しさん
05/09/15 14:31:54
>>938
f2()のプロトタイプ宣言が必要っぽい。
942:デフォルトの名無しさん
05/09/15 16:28:36
Incompatibilities Between ISO C and ISO C++, David R. Tribble
URLリンク(david.tribble.com)
・ 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:デフォルトの名無しさん
05/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
05/09/15 17:49:27
あ,すいません.長々と書きましたけれど結論としては,
936のコードは(標準に準拠していないという意味で)正しくないと思います.
945:936
05/09/15 22:07:49
>>943
なるほど。
実体化の時点で名前の解決を行っても、
実体化の時点の文脈が考慮されるとは限らないんですね。
皆様、ありがとうございました。
946:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/09/16 01:33:46
>>946 undeclared identifier `misc_value'
948:デフォルトの名無しさん
05/09/16 09:43:59
>>946
テンプレート関係ないやん。
949:デフォルトの名無しさん
05/09/18 16:56:08
STLportではコンパイルできるけれど、
g++のSTLではエラーが出てしまうようなコードってどんなものがあるでしょうか?
vectorやstringくらいしか使ってないんですが、コンパイルでエラーが出ます。。
950:デフォルトの名無しさん
05/09/18 17:25:59
エラーメッセージ書かん奴には答えない
951:デフォルトの名無しさん
05/09/18 17:33:35
>>949
氏ね!
952:デフォルトの名無しさん
05/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:デフォルトの名無しさん
05/10/05 18:45:40
>template<int num> struct power<num, 0>{ enum { value = 0 }; };
それはどうかと思うぞ。
954:デフォルトの名無しさん
05/10/05 19:02:12
template<int num> struct power<num, 0>{ enum { value = 1 };};
955:デフォルトの名無しさん
05/10/05 19:13:50
<0,0>,<num,1>の特殊化は必要ないな
956:デフォルトの名無しさん
05/10/05 21:12:57
むしろこうしてコンパイル時エラーにしろよ。
template<> struct power<0, 0>{};
957:デフォルトの名無しさん
05/10/05 21:24:22
0^0って数学的にはどうなるの?
958:ヽ(´ー`)ノ ◆.ogCuANUcE
05/10/05 22:22:38
>>956
n^0 = 1
959:ヽ(´ー`)ノ ◆.ogCuANUcE
05/10/05 22:23:20
スマン。レス番間違えた orz
960:デフォルトの名無しさん
05/10/05 22:28:09
>>957-958
一方で0 ^ n = 0となっているから問題になる。
ところで^と言えばXORの立場が。
961:デフォルトの名無しさん
05/10/06 12:22:20
VC6のtemplate関数ってバグある気がするんだけど...
template<typename T> void test();
引数無し呼んだときに解決できてないみたい...
template<typename T> void test(const T&);
みたいにすればオーバーロードで解決できるのか、大丈夫みたいなんだが...
962:デフォルトの名無しさん
05/10/06 12:36:11
いまどきそんな化石コンパイラに文句言われても…
963:デフォルトの名無しさん
05/10/06 13:39:14
化石以前にtemplateに関しては欠陥コンパイラですから・・・
964:デフォルトの名無しさん
05/10/06 17:42:46
そもそもC++コンパイラじゃないですから
965:デフォルトの名無しさん
05/10/06 22:25:31
少なくともANSI/ISO C++準拠とは言えないな。
966:デフォルトの名無しさん
05/10/07 04:44:36
じゃーVC7はどうですか?
967:デフォルトの名無しさん
05/10/07 05:23:27
7.1はかなりまとも。
968:デフォルトの名無しさん
05/10/07 12:23:52
7と7.1は全然違うぞ
7はかなり微妙
969:デフォルトの名無しさん
05/10/07 13:11:10
7はCStringにバグがあったね。STL周りもちょっと不安定なところがあった気もする。
970:デフォルトの名無しさん
05/10/07 14:50:27
7.1って具体的にclのどのバージョン?
今
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
っての使ってるけど
971:デフォルトの名無しさん
05/10/07 15:06:35
VS.net(VC.net)2003か、VCTK2003のやつが7.1
13.10.3077なら7.1だな。VS.net2003の方のやつだろ。
972:デフォルトの名無しさん
05/10/14 17:36:27
codeguruに記事の投稿してみたがレビュー通んないとだめなんだね
973:デフォルトの名無しさん
05/10/18 15:57:25
age
974:デフォルトの名無しさん
05/10/26 22:29:10
人稲杉なので、バカネタを投下。
URLリンク(www.hakusi.com)
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:デフォルトの名無しさん
05/10/27 00:15:14
>>974
せっかくなので便乗しておきますね.将来の話なのでアレですけれど.
URLリンク(www.open-std.org)
976:デフォルトの名無しさん
05/10/29 10:05:49
難読コンテスト会場はここですか?
977:デフォルトの名無しさん
05/10/31 13:08:43
>>974
すげー--w
確かに scanf っぽいこと出来るし。
でも、Perl みたいで汚いな。使おうとは思わんけど。
978:デフォルトの名無しさん
05/10/31 13:59:50
>>974
マジキモス
979:デフォルトの名無しさん
05/11/02 14:02:41
>>974
良くこんなん書く気になるなあ。
980:デフォルトの名無しさん
05/11/02 14:40:35
>>975
boostな人達はあれば便利だけど、一般人的にはどうなのかなあ?
981:デフォルトの名無しさん
05/11/02 16:19:39
>>980
どの辺が便利なのか理解に苦しむ。
982:デフォルトの名無しさん
05/11/03 13:49:05
>>980
型安全な printf, scanf というのが一番インパクトが大きいと思います.
後,lambda のような(擬似的な)可変長テンプレート引数を使ったライブラリの
コンパイル時メッセージが見やすくなるというのもあるかと.
>>981
Boost な人にとっては,これまでプリプロセッサなどで力技で実装していた
Function, Tuple, MPL, Lambda など多くのライブラリの実装が
非常に楽に見通しよく実装できるようになり,便利になると思います.
983:デフォルトの名無しさん
05/11/03 15:15:01
>>982
コンパイルエラーなどたいして問題じゃないけどね。
それよりもデバッグの方が大変。
984:デフォルトの名無しさん
05/11/03 15:19:33
変な拡張するより単にプリプロセッサを名前空間対応にすればいいだけちがうの?
985:デフォルトの名無しさん
05/11/03 15:30:42
>>984
それじゃプリプロセッサにならないでしょ。
986:デフォルトの名無しさん
05/11/03 17:19:51
え、C/C++のプリプロセッサってトークン理解してるはずなんだけどなあ。
商用じゃプリプロセスと同時に解析するのが主流だし。
テンプレート引数程度の局所的変更じゃ根本的解決にならないでしょ。
987:デフォルトの名無しさん
05/11/03 17:26:54
名前空間を通常のものとプリプロセッサで共有しようとすると
泥沼になる気がする。(例えば
# define STD_BEGIN namespace std{
とか)
pp専用の名前空間ならwaveが実験的に対応している。
988:デフォルトの名無しさん
05/11/03 22:37:23
プリプロセッサと言えば、C++/CLIでとんちきな拡張してるよ。
スペース区切りキーワードってやつ。
URLリンク(www.microsoft.com)
989:デフォルトの名無しさん
05/11/04 00:29:44
プリプロセッサと本体の間のフォーマットってANSIか何かで標準規格ある?
#132 "hogehote.h"
たいていはこんなの出るんだよね?
990:デフォルトの名無しさん
05/11/04 01:08:57
次スレ立てて良いですか?
991:デフォルトの名無しさん
05/11/04 01:21:16
C++相談室で十分だと思うんだ。
992:デフォルトの名無しさん
05/11/04 01:32:58
ハゲドー
一年もかかってやっと1スレなペースだし
993:デフォルトの名無しさん
05/11/04 01:40:20
>>983
> コンパイルエラーなどたいして問題じゃないけどね。
断言君さようなら
994:デフォルトの名無しさん
05/11/04 11:26:29
断言君だって。なにその俺様用語w
オナニーマクロだらけの糞コード書いてる奴は
日本語にもそれが出るね。
995:デフォルトの名無しさん
05/11/04 12:12:24
断言君 の検索結果 約 926,000 件中 1 - 10 件目 (0.27 秒)
996:デフォルトの名無しさん
05/11/04 12:25:58
俺も>>983を支持する。
ランタイムエラーが恐ろしいのであって、
コンパイルエラーなどコンパイラとの対話交渉に過ぎない。
997:デフォルトの名無しさん
05/11/04 13:14:27
てかさ、コンパイルエラーが出てたら、
そもそも実行ファイルはビルドされて無いんじゃないか?
ワーニングなら分かるけど。
998:デフォルトの名無しさん
05/11/04 13:49:38
つぎスレ立てるかどうか迷っているんだが
このスレのタイトルをよく吟味したら
「統合」:いくつかの物を一つにまとめあわせること
このように辞書では出ている。
つーことは「STL相談室」も「BOOSTを語れ」も入らないよーな気がした。
それとも、ここのつぎスレが要らないのか?
そんな疑問を抱いてしまって、俺には次スレを立てる勇気がない。
さあ。次をたてる勇者はだれか。
999:デフォルトの名無しさん
05/11/04 13:53:56
boostは微妙だがSTLスレもこのスレも必要なし
あっても混乱するだけ
1000:デフォルトの名無しさん
05/11/04 14:02:28
STLを使うと実行ファイルのサイズが10倍になるから
スレは統合すべきだと思います。
1001:1001
Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5385日前に更新/262 KB
担当:undef